【问题标题】:configure.in: AM_DISABLE_SHARED doesn't change my Makefileconfigure.in: AM_DISABLE_SHARED 不会改变我的 Makefile
【发布时间】:2010-05-15 20:38:38
【问题描述】:

我对使用 Makefile 和 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 源代码的编译版本,一个是我修改后的版本?我认为静态库应该可以工作。有一种简单的方法可以让静态库正常工作,还是有其他简单的解决方案可以解决我的问题?我只是不想每次想将我的版本与原始版本进行比较时都重新“制作”和重新“制作安装”。

【问题讨论】:

    标签: makefile static-libraries static-linking configure autoconf


    【解决方案1】:

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

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

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

    【讨论】:

    • 对于使用 libtool 的软件包,它是 ./configure --disable-shared,而不是 --disable-dynamic
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多