1

我对使用 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。在我“进行安装”之后,我仍然得到与上面相同的结果。

获得两个版本的代码的简单方法是什么,一个带有原始 Camellia 源代码编译,一个带有我的修改版本?我认为静态库应该可以工作。有一种简单的方法可以让静态库正常工作,还是有其他简单的解决方案可以解决我的问题?每次我想将我的版本与原始版本进行比较时,我只是不想重新“制作”和重新“制作安装”。

4

2 回答 2

1

我对 autoconf 不熟练,我不知道为什么您尝试静态链接失败,但如果动态链接有效,我认为使用共享库实际上会更好地解决您的问题。

只需制作两个共享库,一个使用原始 Camellia 代码,一个使用修改后的版本。将它们放在两个不同的目录中,当您运行时,myprogram您可以通过切换 LD_LIBRARY_PATH(或您用来查找库的任何内容)或保留符号链接/usr/local/lib并在库之间切换来在它们之间进行选择。这相对于静态库的优势(除了它有效的事实之外)是您可以修改修改后的代码,重建共享库并运行而无需重建myprogram(只要您不修改签名)。

PS一个实验:尝试删除共享库/usr/local/lib并在没有标志的情况下重建-static,就像您使用共享库一样。理论上,这应该导致 gcc 使用静态库。结果可能会为静态链接失败的原因提供线索。

于 2010-05-16T07:48:36.170 回答
1

autoconf您是否在添加后AM_DISABLE_SHARED和配置、制作、制作安装之前重新运行?您也可以使用configure --disable-dynamic它来停止它构建共享库。确保删除任何以前安装的 -make uninstall应该这样做。我看不出还有什么明显错误的。尝试明确:

gcc -static -o myprogram myprogram.c /usr/local/lib/libCamellia.a

或将其分解为两个步骤并检查中的符号myprogram.o是您所期望的nm myprogram.o

于 2010-05-16T03:18:24.643 回答