Gcc C动态库上的符号查找错误

Gcc C动态库上的符号查找错误,gcc,linker,undefined-symbol,dynamic-library,Gcc,Linker,Undefined Symbol,Dynamic Library,我有一个让我发疯的问题。 我有一台Ubuntu开发者机器。 我下载了一个工具包,并将其包含在我的C项目(eclipse)中。 好吧,如果我在centos虚拟机上使用eclipse构建项目,那么复制到ubuntu系统的结果应用程序运行良好。在centos机器上,命令make可随时生成一个工作应用程序 如果我在ubuntu机器上复制项目,包括makefile,并通过make命令重建(makefile不会更改!!!!!!!!!!!),则生成的应用程序会出现“符号查找错误:…未定义符号…” 找不到的函数

我有一个让我发疯的问题。 我有一台Ubuntu开发者机器。 我下载了一个工具包,并将其包含在我的C项目(eclipse)中。 好吧,如果我在centos虚拟机上使用eclipse构建项目,那么复制到ubuntu系统的结果应用程序运行良好。在centos机器上,命令make可随时生成一个工作应用程序

如果我在ubuntu机器上复制项目,包括makefile,并通过make命令重建(makefile不会更改!!!!!!!!!!!),则生成的应用程序会出现“符号查找错误:…未定义符号…”

找不到的函数被“声明”(但未实现)到一个库中(包含在工具箱中,而不是我的产品!!!)并实现到另一个库中(始终包含在工具箱中)

为什么????最重要的是,如何修复?我还应该在链接时包含这些动态库?(但是makefile是相同的!)

相同的生成文件 两种不同的操作系统,make不起作用 两个不同的操作系统,复制的应用程序和相关的库,都能正常工作

非常感谢。。。一杯啤酒(在不来梅)给谁让我明白我在哪里做一个

我补充更多细节:

cmd(在ubuntu和centos上相同):

gcc版本:

gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4 [NOT WORKING]
gcc (GCC) 4,8,3 20140911 (Red Hat 4,8,3-9) [WORKING]
在Ubuntu上安装ldd:

    linux-vdso.so.1 =>  (0x00007ffd26b15000)
libtrek_toolkit_ds_api.so.0 => not found

libtrek_toolkit_common_api.so.0 => not found

libtrek_toolkit_cfdp_api.so.0 => not found

librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f23d29cb000)

libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f23d2606000)

libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f23d23e8000)

/lib64/ld-linux-x86-64.so.2 (0x00007f23d2bd3000)
在Centos上安装ldd:

linux-vdso.so.1 =>  (0x00007fffdd569000)

libtrek_toolkit_ds_api.so.0 => not found

libtrek_toolkit_common_api.so.0 => not found

libtrek_toolkit_cfdp_api.so.0 => not found


libcfdp_plus.so.0 => not found
<--- !!! this is the difference !!!

librt.so.1 => /lib64/librt.so.1 (0x00007f158e0c9000)

libc.so.6 => /lib64/libc.so.6 (0x00007f158dd08000)

libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f158daec000)

/lib64/ld-linux-x86-64.so.2 (0x00007f158e2fb000)
错误:

./put: symbol lookup error: /home/andrea/put/lib/libtrek_cfdp_device_api.so: undefined symbol: register_printf_debug
“register_printf_debug”包含在库cfdp_plus中,在centos上构建时包含,而在Ubuntu上构建时不包含


那么,如何告诉链接器做好它的工作并包含这个库呢?

首先发送啤酒,这就是给我灵感的原因。:)我只是在开玩笑,我看起来有些东西我不太明白。通常,当你试图在最小的设置上重现错误时,你大部分时间都会看到错误。实际上,我想了解gcc在centos和ubuntu之间的工作方式是否不同。最小的环境是由eclipse生成(并工作)的ubuntu、shell和makefile。。。但它给出了未定义的符号错误!嘿,C建设者!也许我发现了问题。当我在centos(working environment,工作环境)上列出库(ldd)时,我发现我的应用程序包含定义缺少的函数的库(在任何情况下都是动态的)。当我在ubuntu上做同样的事情时,我发现这个动态库丢失了!!!那么,为什么ubuntu上的gcc不包括这个库呢?以及如何迫使这一点。。。链接器做它的工作???不要使用整个归档,它不是它的用途。设置正确的LD_LIBRARY_路径并重新运行
ldd
,它会递归查找,没有正确的路径,结果不会告诉任何事情。如果我正确理解依赖项,则将
-lcfdp\u plus
移到
-ltrek\u工具箱\u cfdp\u api
之前。检查文件系统中不再存在这些库。检查库中的
.so
是否有符号链接以更正
.so.0
。如果其他事情都失败了,请考虑使用<代码> LD.Debug G/<代码>。谢谢Kelar。依赖于cfdp_plus的库是libtrek_cfdp_device_api,而不是工具箱。。。我试着把cfdp_plus放在任何位置,没有任何变化!请考虑在CENTOS上同样的GCC CMD工作得很好!并生成一个在Ubuntu上复制的应用程序。在Ubuntu上使用eclipse在Centos上生成的相同makefile进行编译是行不通的。在Ubuntu上配置为Centos的Eclipse也不起作用!!!已正确找到所有请求的库。我看到的唯一区别是:gcc版本(ubuntu上更新的版本)和ldd结果(Centos包括cfdp_plus,Ununtu不包括)
gcc -L/home/andrea/put/lib -o "put" ./main.o -ltrek_toolkit_ds_api -ltrek_toolkit_common_api -ltrek_toolkit_cfdp_api -Wl,--whole-archive -lcfdp_plus -Wl,--no-whole-archive -lrt
./put: symbol lookup error: /home/andrea/put/lib/libtrek_cfdp_device_api.so: undefined symbol: register_printf_debug