当我尝试构build以下程序时: #include <stdio.h> int main(void) { printf("hello world\n"); return 0; } 在OS X 10.6.4上,使用以下标志: gcc -static -o blah blah.c 它返回这个: ld: library not found for -lcrt0.o collect2: ld returned 1 exit status 有没有其他人遇到过这个问题,还是没有其他人受到影响? 任何修复? 谢谢
在x86_64 linux上使用gcc和ld我需要链接到更新版本的库(glibc 2.14),但可执行文件需要在具有较旧版本(2.5)的系统上运行。 由于唯一不兼容的符号是memcpy(需要memcpy@GLIBC_2.2.5,但提供memcpy@GLIBC_2.14的库),我想告诉链接器,不要使用memcpy的默认版本,而应该使用我指定的旧版本。 我发现一个非常尴尬的方法:只需在链接器命令行中指定一个旧的.so文件的副本。 这工作正常,但我不喜欢有多个.so文件(我只能通过指定所有旧链接库,我链接到,也有参考memcpy)的想法检查到svn和我的生成系统。 所以我正在寻找一种方法来告诉链接器采用旧版本的符号。 对我不起作用的select是: 使用asm.symver(在Trevor Pounds的Blog的Web Archive中可以看到),因为这将要求我确保symver是所有使用memcpy的代码,这将是非常困难的(复杂的代码库和第三方代码) 与旧图书馆保持搭build环境; 只是因为我想在我的桌面系统上开发,这将是一个皮塔同步在我们的networking中的东西。 当考虑链接器所做的所有工作时,似乎并不是一件困难的事情,毕竟它有一些代码也可以找出默认的符号版本。 任何与简单链接器命令行(如创build一个简单的链接器脚本等)复杂度相同的想法也是受欢迎的,只要它们不是像编辑所产生的二进制文件那样的奇怪黑客… 编辑:为了节约这给未来的读者,除了下面的想法,我发现了选项 – –wrap到链接器,这可能有时也是有用的。
我已经通过yum在Fedora 20上安装了boost,并尝试一些简单的例子。 不过,我无法从日志logging教程中编译第一个示例。 用g++ -c boosttest.cc编译g++ -c boosttest.cc可以正常工作,但是当我试图链接它时,却遇到了很多错误 g++ boosttest.o -o boosttest -lboost_log -lpthread 完整的错误日志: boosttest.o: In function `main': boosttest.cc:(.text+0x44): undefined reference to `boost::log::v2s_mt_posix::trivial::logger::get()' boosttest.cc:(.text+0x9a): undefined reference to `boost::log::v2s_mt_posix::trivial::logger::get()' boosttest.cc:(.text+0x167): undefined reference to `boost::log::v2s_mt_posix::trivial::logger::get()' boosttest.cc:(.text+0x1bd): undefined reference to `boost::log::v2s_mt_posix::trivial::logger::get()' boosttest.cc:(.text+0x28a): undefined reference to `boost::log::v2s_mt_posix::trivial::logger::get()' boosttest.o:boosttest.cc:(.text+0x2e0): more undefined references to `boost::log::v2s_mt_posix::trivial::logger::get()' follow boosttest.o: In function `boost::log::v2s_mt_posix::record::reset()': […]
对不起,有很多类似的问题,但我发现谷歌searchCMake查询总是产生类似,但不是相同的场景,冲突CMake命令等! 我需要强制我的项目构build32位的二进制文件,因为我必须链接到一个只有32位的库。 我根据如下错误消息来诊断: /usr/bin/ld: i386 architecture of input file `*external-32bit-lib*' is incompatible with i386:x86-64 output 从我所收集到的,我应该使用: set (CMAKE_CXX_FLAGS "-m32") 这确实改变了事情 – 我现在得到了几个错误,如: /usr/bin/ld: i386 architecture of input file `*project-output-lib*' is incompatible with i386:x86-64 output 而且对于外部库也是一样的错误。 我认为这是因为-m32使gcc生成32位二进制文件,但ld仍然在尝试64位输出? 进一步谷歌search这个问题并没有成功,所以如果任何人都可以certificate我是正确的,并给出了正确的方式做到这一点,我将不胜感激! 非常感谢!
我有一些使用一些共享库的代码(在gcc上的c代码)。 在编译时,我必须使用-I和-L显式地定义include和库目录,因为它们不在标准位置。 当我尝试运行代码时,出现以下错误: ./sync_test ./sync_test: error while loading shared libraries: libsync.so: cannot open shared object file: No such file or directory 但是,请执行以下操作,一切正常: export LD_LIBRARY_PATH="/path/to/library/" ./sync_test 现在奇怪的是,这只能工作一次。 如果我再次尝试运行sync_test,则会得到相同的错误,除非先运行导出命令。 我尝试添加以下内容到我的.bashrc,但没有任何区别: LD_LIBRARY_PATH="/path/to/library/"
我有大约50个不同的静态库被链接到我的C + +项目和链接平均需要70年代。 我发现这次更改库的链接顺序。 如果链接器不需要在整个符号表中search一组符号,就可以预计到这一点。 我想我可以使用“nm”来获得静态库之间的依赖关系图。 但是,这只会给我一个“正确的”链接顺序。 获得最快链接顺序的因素是什么? 我觉得这将与上述依赖关系图有关,通过获得一个遍历,试图尽量减less一些数量,但我真的不知道是哪一个。 任何帮助,将不胜感激。 我现在主要是使用intel编译器和gcc编译器。 当我用top检查它们时,它们似乎都在使用GNU ld链接器。 希望这可以帮助… 所以为了澄清一下我想要问的东西,我已经知道如何从一组静态库中获得一个1遍的顺序。 我自己写了这个脚本,但是根据Olaf的回答,下面有这样的着名工具。 我的问题是,我已经有两个单程链接sorting,其中一个在〜85s内运行,另一个在〜70s内运行。 很明显,我们在1阶命令中还可以做更多的优化。
makefile中-I和-L标志的用法是什么?
有时候用一个C程序来模拟一些使用大量静态内存的东西是很方便的。 我注意到,在转换到Fedora 15之后,程序花了很长时间来编译。 我们正在谈论30s与0.1s。 更奇怪的是,ld(链接器)正在耗尽CPU,慢慢地开始占用所有可用的内存。 经过一番捣鼓,我设法find了这个新问题和我的交换文件的大小之间的关系。 以下是本次讨论的示例程序: #include <string.h> #include <stdlib.h> #include <stdio.h> #define M 1000000 #define GIANT_SIZE (200*M) size_t g_arr[GIANT_SIZE]; int main( int argc, char **argv){ int i; for(i = 0; i<10; i++){ printf("This should be zero: %d\n",g_arr[i]); } exit(1); } 这个程序有一个巨大的数组,声明的大小约为200 * 8MB = 1.6GB的静态内存。 编译这个程序需要花费过多的时间: [me@bleh]$ time gcc HugeTest.c real 0m12.954s user […]
这很奇怪,因为我可以通过删除对libm的引用来消除下面的错误。 gcc -o example example.o -Wl -L/home/kensey/cdev/lib -L/usr/lib/x86_64-linux-gnu -lmysqlclient -lpthread -lz -L/usr/lib/x86_64-linux-gnu -lm -lrt -ldl -lcdev -L/home/kensey/www.tools/gplot-lib -lgplot -L/home/kensey/www.tools/gd1_3ret -lgd -lxml2 -lcurl /usr/bin/ld: /home/kensey/www.tools/gplot-lib/libgplot.a(set.o): undefined reference to symbol 'floor@@GLIBC_2.2.5' /usr/bin/ld: note: 'floor@@GLIBC_2.2.5' is defined in DSO /usr/lib/x86_64-linux-gnu/libm.so so try adding it to the linker command line /usr/lib/x86_64-linux-gnu/libm.so: could not read symbols: Invalid operation collect2: ld […]
我通过CMAKE_C_FLAGS在CMake中设置了CFLAGS。 像这样设置LDFLAGS?