Makefile configure.in:AM#u DISABLE#u SHARED donds';不要更改我的生成文件

Makefile configure.in:AM#u DISABLE#u SHARED donds';不要更改我的生成文件,makefile,static-libraries,static-linking,configure,autoconf,Makefile,Static Libraries,Static Linking,Configure,Autoconf,我对使用makefile和autoconf非常陌生。我正在使用Camellia图像库,并试图将我的代码与它们的库进行静态链接。在Camellia映像库上运行“make”时,我在/usr/local/lib目录中获得libCamellia.a、.so、.la和.so.0.0文件。这是我用来编译代码及其库的命令: gcc -L/usr/local/lib -lCamellia -o myprogram myprogram.c 这很好,但当我尝试静态链接时,我得到的是: gcc -static -L

我对使用makefile和autoconf非常陌生。我正在使用Camellia图像库,并试图将我的代码与它们的库进行静态链接。在Camellia映像库上运行“make”时,我在/usr/local/lib目录中获得libCamellia.a、.so、.la和.so.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。在我“makeinstall”之后,我仍然得到与上面相同的结果


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

添加
AM\u DISABLE\u SHARED
和配置之前,是否重新运行
autoconf
?您还可以使用
configure--disable dynamic
停止构建共享库。确保删除以前安装的任何组件-
确保卸载应执行此操作。我看不出还有什么明显的问题。试着明确地说:

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

或者将其分为两个步骤,并检查
myprogram中的符号。o
是您对
nm myprogram.o

的期望。我不熟悉autoconf,我不知道您尝试静态链接失败的原因,但是,如果动态链接起作用,我认为使用共享库实际上会更好地解决您的问题

只需创建两个共享库,一个使用原始Camellia代码,另一个使用修改后的版本。将它们放在两个不同的目录中,当您运行
myprogram
时,您可以通过切换LD_LIBRARY_路径(或任何用于查找库的路径)或在
/usr/local/lib
中保留符号链接并在库之间切换来选择它们。与静态库相比,这种方法的优点(除了它可以工作的事实)是,您可以修改修改后的代码,重建共享库并运行,而无需重建
myprogram
(只要不修改签名)


另一个实验:尝试从
/usr/local/lib
中删除共享库,并在不使用
-static
标志的情况下重建,就像使用共享库一样。理论上,这将导致gcc使用静态库。结果可能会给出静态链接失败的原因。

对于使用libtool的包,它是
/configure--disable shared
,而不是
--disable dynamic