[英]How to use/link source code as a library (C/C++)
我試圖了解如何使用構建和使用源代碼,然后在我的項目中鏈接到它。 具體來說,我正在嘗試使用 SDL2 庫來執行此操作。 我在 mac 上,想在命令行中執行此操作(我沒有使用 xcode)。
我已經下載了源代碼(您可以在此處找到: https://www.libsdl.org/download-2.0.php ),並將該文件夾放入與我的 main.c 文件相同的目錄中。
我 cd 進入這個目錄並運行以下命令./configure
然后make
。
接下來,我可以運行命令make install
將庫放入我的 usr/bin 目錄中。 然后,我可以像這樣在命令行中鏈接到這個庫clang main.c -o main -lSDL2
但我試圖了解如何不執行此步驟並鏈接到我的應用程序目錄中的代碼。
我一直在嘗試運行這樣的命令:
clang main.c -o main -L./SDL2/build/.libs -I./SDL2/include -lSDL2
clang main.c -o main -L./SDL2/build/.libs -lSDL2
我的思考過程是 -L 標志告訴構建代碼應該鏈接到哪里,因為在 ./SDL2/build/.libs 文件夾中我看到名為 libSDL2.a、libSDL2-2.0.0.dylib 和libSDL2.dylib。 這些命令實際上確實成功構建了,我得到了一個 output main
文件,但是當我嘗試運行該文件時,出現以下錯誤:
dyld: Library not loaded: /usr/local/lib/libSDL2-2.0.0.dylib
Referenced from: /Users/jerfp/Documents/personal/c-stuff/sdl-test-source/./main
Reason: image not found
[1] 37284 abort ./main
我不確定我做錯了什么,或者當我用 -L 標志指定了不同的路徑時,為什么它在 /usr/local/lib/ 中尋找庫。
還要注意,在我的 main.c 文件中,我包含了 sdl header,如下所示:
#include "SDL2/include/SDL.h"
因為那是 SDL.h 文件的文件夾路徑。 我也不確定這是正確的,但這是我目前正在做的。
這里的任何幫助將不勝感激。 我是 C 的新手,只是想了解鏈接/構建/包括庫是如何工作的,而不用像自制軟件或 make install 這樣的東西安裝它們。
這是我正在使用的編譯器:
Apple clang version 12.0.5 (clang-1205.0.22.9)
Target: x86_64-apple-darwin20.4.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
為了使用動態庫,您必須在構建時和運行時指定搜索路徑。 -L
標志在構建時告訴您的 linker 在哪里可以找到庫,但在可執行文件中,符號表會將動態庫中的符號列為未定義,這意味着沒有與這些符號關聯的 memory 地址。 在運行時,動態 linker 必須找到相同的庫才能加載可執行文件。 為動態 linker 提供此路徑的最簡單方法是在運行時使用LD_LIBRARY_PATH
環境變量(在 Mac 上它可能是DYLD_LIBRARY_PATH
):
LD_LIBRARY_PATH=./SDL2/build/.libs ./main
您還可以將庫路徑嵌入到可執行文件中,盡管這假定您的庫在每次運行可執行文件時都位於可預測的位置。 為此,您可以使用 -rpath -rpath
標志,這將在可執行文件的.dynamic
部分中創建一個DT_RUNPATH
條目(如果您不知道所有這些意味着什么,請不要擔心)。 對於相對路徑,您可以使用特殊值$ORIGIN
來引用包含可執行文件的目錄。 在您的情況下,該命令看起來像這樣(注意clang
-Wl
標志應傳遞給底層鏈接器):
clang -Wl,-rpath,'$ORIGIN/SDL2/build/.libs' main.o -o main -L./SDL2/build/.libs -lSDL2
然后你應該能夠在沒有特殊環境變量的情況下運行可執行文件:
./main
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.