當前位置:首頁 » 編程軟體 » 編譯sdl2

編譯sdl2

發布時間: 2022-08-10 02:10:51

A. 關於linux下連接動態庫問題

gcc編譯時,當使用動態庫編譯可以按照幾種寫法
1.gcc test.c ./libSDL2-2.so
2.gcc test.c -lSDL2-2
3.gcc test.c -L/home/test -lSDL2-2
一般的編譯參數都是按照2或3去寫
2寫法的含義是從/lib或者/usr/lib目錄下尋找名稱為SDL2-2的庫,即尋找/lib/libSDL2-2.so或者/usr/lib/libSDL2-2.so文件進行鏈接,當然如果沒有動態庫就會去找靜態庫,再沒有應該就會在編譯時報錯
3寫法的含義是從-L參數首先從指定的目錄中尋找需要鏈接的庫文件,隨後再去尋找系統文件夾中是否存在需要的庫
1寫法的含義是將當前目錄下的./libSDL2-2.so.0文件鏈接進最終文件,因此執行readelf -a a.out後在動態庫部分所看到的路徑就是./libSDL2-2.so.0,進而在執行文件時僅會從當前目錄下尋找libSDL2-2.so.0文件,當執行文件時所在的目錄下沒有該文件時就會出現找不到庫文件的操作

你第二次操作時,因為function.so庫文件與a.out文件在同一個目錄,同時也是在該目錄下執行的ldd操作及運行a.out,a.out在載入動態庫時從當前目錄下找到了所需要的庫文件,此時能夠執行成功(ldd命令實質是一個腳本,通過設置環境變數運行動態庫鏈接器來輸出所有待鏈接的動態庫)。
你可以試試將a.out拷貝至其他目錄再次運行,將出現和第一次操作時一樣的現象,找不到function.so文件。

具體的解決方法就是修改編譯參數,將./libSDL2-2.so.0修改為-lSDL2-2並將libSDL2-2.so.0文件拷貝至/usr/lib目錄下,並且可能因為沒有修改鏈接器的緩存文件(將可能找不到帶版本號後綴的動態庫),需要在/usr/lib目錄下建立一個文件連接(ln -s libSDL2-2.so.0 libSDL2-2.so)或者直接修改名稱為libSDL2-2.so

B. 如何安裝/編譯在Linux / Ubuntu的SDL2 C C 05

1.使用apt-get 安裝開發包
sudo apt-get install libsdl2-dev
2.編輯源文件, hello.c

#include <SDL2/SDL.h>int main(){ SDL_Window* window =0; SDL_Renderer* render=0; SDL_Init(SDL_INIT_EVERYTHING); window=SDL_CreateWindow("hello",SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,640,480,SDL_WINDOW_SHOWN); render=SDL_CreateRenderer(window,-1,0); SDL_SetRenderDrawColor(render,0,255,0,255); SDL_RenderClear(render); SDL_RenderPresent(render); SDL_Delay(3000); SDL_DestroyWindow(window); SDL_DestroyRenderer(render); SDL_Quit(); return 0;}

3.編譯
gcc hello.c -lSDL2
如果編譯成功,會生成a.out可執行文件

4.運行
./a.out

C. 別踩白塊c語言程序編譯

只是禪模式的,如果是學慣用的,知道一個模式的應該其他也會了,如果是想玩的話下正版吧= =

#include "SDL2/SDL.h"
#include "SDL2/SDL_ttf.h"
#include<string.h>
// 使用的頭文件
int W; // 窗口寬
int H; // 窗口高
int PH; // 游戲區的高
int i, df = 0; // 定義的變數
char sorry[] = "游戲不適合你的手機", win[9] = "You win!", lose[10] =
"You lose", str[19] = "得分:";
Uint32 began = 0;
float time = 0.0; // 定義的計時變數
bool quit = false; // 退出標志
float X = 0, Y = 0; // 用於獲取觸控位置的坐標
SDL_Event event;
// 定義一個事件
SDL_Window *w = NULL; // 創建一個窗口指針
SDL_Renderer *ren = NULL; // 創建一個渲染器指針
SDL_Surface *sur = NULL; // 表面
SDL_Surface *sur1 = NULL; // 得分表面
SDL_Surface *text = NULL; // 標題文本區表面
SDL_Texture *tex = NULL; // 畫刷
SDL_Texture *tex1 = NULL; // 畫刷
SDL_Texture *tex2 = NULL; // 畫刷
TTF_Font *font = NULL; // 定義一個字體
SDL_Color color, fontcolor; // 定義字體顏色
SDL_Rect rect[4]; // 屏幕出現的四個黑塊
SDL_Rect title; // 標題區
SDL_Rect pp, over;
void change(); // 使方塊動起來
void init(); // 啟動sdl及相關
void draw(); // 畫圖
void start(); // 初始化相關數據
void end(); // 游戲結尾
int main(int argc, char **argv)
{ // 主函數
init();
start();
began = SDL_GetTicks(); // 得到開始時間
while (quit == false)
{
draw(); // 畫圖
while (SDL_PollEvent(&event))
{
switch (event.type)
{
case SDL_FINGERDOWN:
X = event.tfinger.x * W;
Y = event.tfinger.y * H;
// 獲取x,y的坐標
if (Y > rect[0].y)
if ((X > rect[0].x) && (X < (W / 4 + rect[0].x))) // 判斷坐標
{
change();
df = df + 1;
}
else // 如果觸屏位置不對
{
quit = true;
if (df < 3)
sur1 = TTF_RenderUTF8_Blended(font, sorry, color);
else
sur1 = TTF_RenderUTF8_Blended(font, lose, color);
}
break;
case SDL_FINGERUP:
break;
default:;
}
if (df > 100) // 如果在30秒內得分超過100
{
quit = true;
sur1 = TTF_RenderUTF8_Blended(font, win, color);
}
}
time = 30 - ((SDL_GetTicks() - began) / 1000); // 計算剩餘時間
if (time == 0.0) // 當時間結束
{
quit = true;
sprintf(str, "時間到,得分:%d", df);
sur1 = TTF_RenderUTF8_Blended(font, str, color);
}
}
tex1 = SDL_CreateTextureFromSurface(ren, sur1); // 把表面轉換成畫刷
SDL_RenderCopy(ren, tex1, NULL, &over);
SDL_RenderPresent(ren);
SDL_Delay(3000); // 暫停3秒
end();
return 0;
}

void change()
{
for (int i = 0; i < 3; i++)
rect[i].x = rect[i + 1].x;
rect[3].x = (random() % 4) * W / 4; // 最上層產生隨機的黑塊
}

void init()
{
SDL_Init(SDL_INIT_EVERYTHING);
w = SDL_CreateWindow("別踩白塊兒", 0, 0, W, H, SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_BORDERLESS); // 配置窗口參數並創建
//
//
ren = SDL_CreateRenderer(w, -1, SDL_RENDERER_PRESENTVSYNC); // 為創建的窗口配置渲染器
TTF_Init(); // 啟動font
font = TTF_OpenFont("/system/fonts/DroidSansFallback.ttf", 60); // 打開系統自帶字體並設置大小為60
}

void draw()
{
sur = SDL_CreateRGBSurface(0, W, H, 32, 0, 0, 0, 0); // 先把表面刷白
SDL_FillRect(sur, NULL, 0xffffff);
for (int i = 0; i < 4; i++)
SDL_FillRect(sur, &rect[i], 0x00000); // 再把黑塊逐個貼上表面
tex = SDL_CreateTextureFromSurface(ren, sur); // 把表面轉換成畫刷*/
sprintf(str, "得分:%d", df);
sur1 = TTF_RenderUTF8_Blended(font, str, color);
tex1 = SDL_CreateTextureFromSurface(ren, sur1); // 把表面轉換成畫刷
sprintf(str, "時間:%.2f\"", time);
text = TTF_RenderUTF8_Blended(font, str, fontcolor);
tex2 = SDL_CreateTextureFromSurface(ren, text); // 把表面轉換成畫刷
SDL_RenderCopy(ren, tex, NULL, NULL);
SDL_RenderCopy(ren, tex2, NULL, &title);
SDL_RenderCopy(ren, tex1, NULL, &pp);
SDL_RenderPresent(ren);
SDL_FreeSurface(sur);
SDL_DestroyTexture(tex);
SDL_FreeSurface(sur1);
SDL_FreeSurface(text);
SDL_DestroyTexture(tex1);
SDL_DestroyTexture(tex2);
}

void start()
{
SDL_GetWindowSize(w, &W, &H); // 得到屏幕解析度
PH = H * 7 / 8;
color =
{
255, 215, 0};
fontcolor =
{
0, 0, 0}; // 字體顏色賦值
float a = PH * 3 / 4 + H / 8;
float wight = W / 4;
float hight = PH / 4;
rect[0].x = 0;
rect[0].y = a;
rect[1].x = wight;
rect[1].y = a - hight;
rect[2].x = wight * 2;
rect[2].y = a - 2 * hight;
rect[3].x = 3 * wight;
rect[3].y = a - 3 * hight;
for (int i = 0; i < 4; i++)
{ // 為黑塊的高和寬賦值
rect[i].h = hight;
rect[i].w = wight;
}
title =
{
1.10, 0, W / 2, W / 8};
pp =
{
W / 2, 0, W / 2, W / 8};
over =
{
0, H / 4, W, H / 4};
}

void end()
{
TTF_CloseFont(font);
TTF_Quit();

D. LINUX下要在C中嵌入Python,編譯的時候怎樣解決庫的連接問題

gcc編譯時,當使用動態庫編譯可以按照幾種寫法1.gcctest.c./libSDL2-2.so2.gcctest.c-lSDL2-23.gcctest.c-L/home/test-lSDL2-2一般的編譯參數都是按照2或3去寫2寫法的含義是從/lib或者/usr/lib目錄下尋找名稱為SDL2-2的庫,即尋找/lib/libSDL2-2.so或者/usr/lib/libSDL2-2.so文件進行鏈接,當然如果沒有動態庫就會去找靜態庫,再沒有應該就會在編譯時報錯3寫法的含義是從-L參數首先從指定的目錄中尋找需要鏈接的庫文件,隨後再去尋找系統文件夾中是否存在需要的庫1寫法的含義是將當前目錄下的./libSDL2-2.so.0文件鏈接進最終文件,因此執行readelf-aa.out後在動態庫部分所看到的路徑就是./libSDL2-2.so.0,進而在執行文件時僅會從當前目錄下尋找libSDL2-2.so.0文件,當執行文件時所在的目錄下沒有該文件時就會出現找不到庫文件的操作你第二次操作時,因為function.so庫文件與a.out文件在同一個目錄,同時也是在該目錄下執行的ldd操作及運行a.out,a.out在載入動態庫時從當前目錄下找到了所需要的庫文件,此時能夠執行成功(ldd命令實質是一個腳本,通過設置環境變數運行動態庫鏈接器來輸出所有待鏈接的動態庫)。你可以試試將a.out拷貝至其他目錄再次運行,將出現和第一次操作時一樣的現象,找不到function.so文件。具體的解決方法就是修改編譯參數,將./libSDL2-2.so.0修改為-lSDL2-2並將libSDL2-2.so.0文件拷貝至/usr/lib目錄下,並且可能因為沒有修改鏈接器的緩存文件(將可能找不到帶版本號後綴的動態庫),需要在/usr/lib目錄下建立一個文件連接(ln-slibSDL2-2.so.0libSDL2-2.so)或者直接修改名稱為libSDL2-2.so

E. 如何成功運行SDL官方提供的Android平台的Demo

操作步驟:
第一步:准備SDL源代碼包;
1. 去官網下載最新版SDL2-2.0.3.tar.gz;
2. 解壓後,可以在根目錄下找到android-project目錄和README-android.txt,前者是一個一個Android工程模板,後者是關於如何使用該工程的文檔說明。
3. 調整目錄,使其成為一個可編譯的工程:
(1) 將android-project目錄剪切到與SDL2-2.0.3同級的目錄;
(2) 然後將SDL2-2.0.3目錄拷貝到android-project\jni目錄下,並重命名為SDL;
第二步:為SDL增加main函數
(1) 下載wiki.libsdl.org/Tutorials#Android.c文件;
(2) 下載之後將其放入android-project\jni\src目錄;
(3) 將main.c加入android-project\jni\src\Android.mk: 在Android.mk中默認有個YourSourceHere.c,將其替換為main.c即可;
第三步:編譯libSDL2.so和libmain.so
註:請確認NDK的bin目錄已經配置到環境變數PATH中去;
打開cmd命令窗口,進入到android-project目錄,然後執行"ndk-build"命令進行編譯。編譯成功後會在android-project根目錄下生成libs目錄,下面有各個平台的需要的這兩個so文件。
第四步:修改build target配置文件
默認的工程是使用的=android-12,必須使這個target與系統配置的一致,否則編譯會失敗. 具體的配置位於android-project/project.properties和android-project/default.properties中。由於adt-bundle-windows-x86_64-20130729.zip包對應的是android-18,因此需要將這兩個文件中的配置全部改為android-18.
第五步:導入Eclipse運行
依次選擇File->New->Android->Android Project from Existing Code,然後選擇android-project目錄將工程文件導入到Eclipse中。
然後選擇按照正常的Android工程運行即可。這個時候程序閃一下什麼都沒有,因為沒有添加資源。可下載一個bmp圖片放到android-project/assets中,這個目錄是由eclipse自動生成的。然後運行就可以看到通過SDL渲染出來的圖片了。

F. LINUX編譯SDL庫(下面指令的含義)

./configure 是一個配置命令,告訴你需要在PC機上編譯,然後用於arm,可能是參數變化了

G. LINUX編譯SDL庫(下面指令的含義)

./configure
是一個配置命令,告訴你需要在PC機上編譯,然後用於arm,可能是參數變化了

H. 如何在MFC對話框中使用SDL2

方法/步驟
新建MFC應用程序,工程名稱為MFCSDL

本例使用基於對話框的程序,注意勾選「基於對話框」

在MFCSDLDlg.h中添加SDL library 頭文件和庫文件應用,並定義所需變數。
#include "../SDL2-2.0.3/include/sdl.h"
#pragma comment(lib, "../SDL2-2.0.3/lib/x86/SDL2.lib")
#define WINDOW_W 640
#define WINDOW_H 480
#define NUM_SPRITES 100
#define MAX_SPEED 1
static SDL_Window* window;
static SDL_Renderer *renderer;
static SDL_Texture * sprite;
static int window_w, window_h;
static int sprite_w, sprite_h;
static SDL_Rect *positions, *velocities;
添加WM_KICKIDLE消息,該消息為微軟保留消息,不公開,用它可以避免自己再重載實現消息循環。
具體過程如下:
1. 在 MFCSDLdlg.h文件加入
afx_msg LRESULT OnKickIdle(WPARAM wParam, LPARAM lParam);
2. 在MFCSDLDlg.cpp中加入消息映射
BEGIN_MESSAGE_MAP(CMFCSDLDlg, CDialogEx)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE(WM_KICKIDLE,OnKickIdle)
ON_WM_CLOSE()
END_MESSAGE_MAP()
3.添加OnKickIdle消息實現。
LRESULT CMFCSDLDlg::OnKickIdle(WPARAM wParam, LPARAM lParam)
{

SDL_Event event;
int done = 0;
while (!done)
{
/* Check for events */
while (SDL_PollEvent(&event)) {
switch (event.type) {
case SDL_WINDOWEVENT:
switch (event.window.event) {
case SDL_WINDOWEVENT_EXPOSED:
SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);
SDL_RenderClear(renderer);
break;
}
break;
case SDL_QUIT:
done = 1;
break;
default:
break;
}
}
MoveSprites(renderer, sprite);
}

return 0; //一定要返回0
}
在OnInitDialog函數中加入初始化代碼。

BOOL CMFCSDLDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();

// 設定此對話方塊的圖示。當應用程式的主視窗不是對話方塊時,
// 框架會自動從事此作業
SetIcon(m_hIcon, TRUE); // 設定大圖示
SetIcon(m_hIcon, FALSE); // 設定小圖示

// TODO: 在此加入額外的初始設定
window = SDL_CreateWindowFrom(m_hWnd);
SDL_SetWindowTitle(window, "SDL Native Window Test");
renderer = SDL_CreateRenderer(window, -1, 0);
SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);
SDL_RenderClear(renderer);
sprite = LoadSprite(renderer, "icon.bmp");

SDL_GetWindowSize(window, &window_w, &window_h);
SDL_QueryTexture(sprite, NULL, NULL, &sprite_w, &sprite_h);
positions = (SDL_Rect *) SDL_malloc(NUM_SPRITES * sizeof(SDL_Rect));
velocities = (SDL_Rect *) SDL_malloc(NUM_SPRITES * sizeof(SDL_Rect));
if (!positions || !velocities) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Out of memory!\n");
// quit(2);
}
srand(time(NULL));
for (int i = 0; i < NUM_SPRITES; ++i) {
positions[i].x = rand() % (window_w - sprite_w);
positions[i].y = rand() % (window_h - sprite_h);
positions[i].w = sprite_w;
positions[i].h = sprite_h;
velocities[i].x = 0;
velocities[i].y = 0;
while (!velocities[i].x && !velocities[i].y) {
velocities[i].x = (rand() % (MAX_SPEED * 2 + 1)) - MAX_SPEED;
velocities[i].y = (rand() % (MAX_SPEED * 2 + 1)) - MAX_SPEED;
}
}
return TRUE; // 傳回 TRUE,除非您對控制項設定焦點
}
在MFCSDLDlg.cpp中,添加LoadSprite函數,注意是static 全局函數,放在所有函數最上方。其作用是載入一個圖片精靈,本例使用一個笑臉圖片。
static SDL_Texture *
LoadSprite(SDL_Renderer *renderer, char *file)
{
SDL_Surface *temp;
SDL_Texture *sprite;

/* Load the sprite image */
temp = SDL_LoadBMP(file);
if (temp == NULL) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't load %s: %s", file, SDL_GetError());
return 0;
}

/* Set transparent pixel as the pixel at (0,0) */
if (temp->format->palette) {
SDL_SetColorKey(temp, 1, *(Uint8 *) temp->pixels);
}

/* Create textures from the image */
sprite = SDL_CreateTextureFromSurface(renderer, temp);
if (!sprite) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create texture: %s\n", SDL_GetError());
SDL_FreeSurface(temp);
return 0;
}
SDL_FreeSurface(temp);

/* We're ready to roll. :) */
return sprite;
}
在LoadSprite後添加MoveSprites函數,其作用是將精靈循環移動,實現動態效果。
static void
MoveSprites(SDL_Renderer * renderer, SDL_Texture * sprite)
{
if(renderer==NULL||sprite==NULL)
return;
int sprite_w, sprite_h;
int i;
SDL_Rect viewport;
SDL_Rect *position, *velocity;

/* Query the sizes */
SDL_RenderGetViewport(renderer, &viewport);
SDL_QueryTexture(sprite, NULL, NULL, &sprite_w, &sprite_h);

/* Draw a gray background */
SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);
SDL_RenderClear(renderer);

/* Move the sprite, bounce at the wall, and draw */
for (i = 0; i < NUM_SPRITES; ++i) {
position = &positions[i];
velocity = &velocities[i];
position->x += velocity->x;
if ((position->x < 0) || (position->x >= (viewport.w - sprite_w))) {
velocity->x = -velocity->x;
position->x += velocity->x;
}
position->y += velocity->y;
if ((position->y < 0) || (position->y >= (viewport.h - sprite_h))) {
velocity->y = -velocity->y;
position->y += velocity->y;
}

/* Blit the sprite onto the screen */
SDL_RenderCopy(renderer, sprite, NULL, position);
}

/* Update the screen! */
SDL_RenderPresent(renderer);
}
8
以上完成,按F7編譯,將icon.bmp文件拷貝到程序執行文件加下,運行程序,可看到如圖效果。

I. sdl2/sdl.h頭文件有什麼用

stdlib 頭文件即standard library標准庫頭文件 stdlib 頭文件里包含了C、C++語言的最常用的系統函數 該文件包含了的C語言標准庫函數的定義 stdlib.h裡面定義了五種類型、一些宏和通用工具函數。 類型例如size_t、wchar_t、div_t、ldiv_t和lldiv_t; 宏例如EXIT_FAILURE、EXIT_SUCCESS、RAND_MAX和MB_CUR_MAX等等; 常用的函數如malloc()、calloc()、realloc()、free()、system()、atoi()、atol()、rand()、srand()、exit()等等。 具體的內容你自己可以打開編譯器的include目錄裡面的stdlib.h頭文件看看。

J. 手機c語言編程軟體哪個好

1:C4droid中文版

C4droid中文版可以說是款Android設備上的最強的 C/C++ IDE,支持多種圖形庫: SDL、SDL2 (需安裝sdl plugin for c4droid)、QT(需安裝CuteLoadear)等,還支持導出APK!

熱點內容
標致5008怎麼連接安卓 發布:2024-04-25 23:25:08 瀏覽:793
安卓下載管理器哪個好 發布:2024-04-25 23:22:48 瀏覽:442
考試系統源碼php 發布:2024-04-25 23:09:46 瀏覽:136
磁碟禁止訪問 發布:2024-04-25 22:53:48 瀏覽:287
多線程ftp上傳 發布:2024-04-25 22:41:36 瀏覽:115
phpqrcode 發布:2024-04-25 22:41:36 瀏覽:33
桂平上網密碼是多少 發布:2024-04-25 22:32:10 瀏覽:575
open函數c語言 發布:2024-04-25 21:47:42 瀏覽:406
簡訊刪除後怎麼找伺服器 發布:2024-04-25 21:15:06 瀏覽:388
查ip地址伺服器數量 發布:2024-04-25 20:49:48 瀏覽:620