我非常擅长使用Makefiles和autoconf。我正在使用Camellia图像库,并试图将我的代码静态链接到他们的库。当我在Camellia图像库上运行“make”时,我在/ usr / local / lib目录中获得了libCamellia.a,.so,.la和.so.0.0.0文件。这是我用来编译代码的命令:
gcc -L/usr/local/lib -lCamellia -o myprogram myprogram.c
这很好用,但是当我尝试静态链接时,这就是我得到的:
gcc -static -L/usr/local/lib -lCamellia -o myprogram myprogram.c
/tmp/cck0pw70.o: In function `main':
myprogram.c:(.text+0x23): undefined reference to `camLoadPGM'
myprogram.c:(.text+0x55): undefined reference to `camAllocateImage'
myprogram.c:(.text+0x97): undefined reference to `camZoom2x'
myprogram.c:(.text+0x104): undefined reference to `camSavePGM'
collect2: ld returned 1 exit status
我想静态链接,因为我正在尝试修改Camellia源代码,我想将我的版本与他们的版本进行比较。所以经过一些谷歌搜索后,我尝试将AM_DISABLE_SHARED添加到configure.in文件中。但是在运行./configure之后,我仍然得到完全相同的Makefile。在我“make install”之后,我仍然得到了相同的结果。
获取我的代码的两个版本的简单方法是什么,一个是使用原始的Camellia源代码编译的,另一个是我的修改版本?我认为静态库应该可行。有一种简单的方法可以使静态库工作,还是有其他简单的解决方案来解决我的问题?每次我想将我的版本与原版本进行比较时,我只是不想重新“制作”并重新“安装”。
答案 0 :(得分:1)
在添加autoconf
之后和configure,make,make install之前,您是否重新运行AM_DISABLE_SHARED
?您也可以使用configure --disable-dynamic
来停止构建共享库。确保删除以前安装的任何内容 - make uninstall
应该这样做。我看不出其他任何明显错误的东西。尝试明确:
gcc -static -o myprogram myprogram.c /usr/local/lib/libCamellia.a
或将其细分为两个步骤,然后检查myprogram.o
中的符号是否符合您对nm myprogram.o
的期望。
答案 1 :(得分:1)
我不熟悉autoconf,我不知道为什么你的静态链接尝试失败,但如果动态链接起作用,我认为使用共享库实际上会更好地解决你的问题。
只需创建两个共享库,一个包含原始Camellia代码,另一个包含修改后的版本。将它们放在两个不同的目录中,当你运行myprogram
时,你可以通过切换LD_LIBRARY_PATH(或者你用来查找库的任何东西)或者在/usr/local/lib
中保持符号链接并切换来选择它们。在图书馆之间。这相对于静态库的优势(除了这个工作的事实)是你可以修改修改后的代码,重建共享库并运行而不必重建myprogram
(只要你不修改签名)。
P.S。实验:尝试从/usr/local/lib
删除共享库并在没有-static
标志的情况下重建,就像使用共享库一样。从理论上讲,这应该会导致gcc使用静态库。结果可能会给出静态链接失败原因的线索。