我试图用g ++将我的可执行程序与2个静态库链接起来。 2个静态库具有相同的函数名称。 我期待链接器的“多重定义”链接错误,但我没有收到。 谁能帮忙解释为什么这样? staticLibA.h #ifndef _STATIC_LIBA_HEADER #define _STATIC_LIBA_HEADER int hello(void); #endif staticLibA.cpp #include "staticLibA.h" int hello(void) { printf("\nI'm in staticLibA\n"); return 0; } 输出: g++ -c -Wall -fPIC -m32 -o staticLibA.o staticLibA.cpp ar -cvq ../libstaticLibA.a staticLibA.oa – staticLibA.o staticLibB.h #ifndef _STATIC_LIBB_HEADER #define _STATIC_LIBB_HEADER int hello(void); #endif staticLibB.cpp #include "staticLibB.h" int hello(void) { printf("\nI'm […]
我写了一个共享的libA.so。 我的程序P将dynamic加载libA.so (使用dlopen,dlsym …)。 这是我的问题: 在libA.so中 ,我必须在静态libB.a中使用函数(例如fun1() ),但是libB.a不用-fPIC编译,而且我也不能重新编译libB.a ,所以我不能将libB.a链接到libA.so。 我已经尝试链接libB.a到P (与-Wl , – 整个档案),为了让dynamic加载器链接fun1()到libA.so加载时。 但是,这是行不通的。 我很确定fun1()是在P (我检查它: nm P | grep "fun1" )。 我能怎么做? 提前致谢!
是否有可能提供一个共享库 – 在创build期间与另一个共享库链接 – 对最终用户是透明的? 作为我的意思的一个例子: 共享库构build g++ … `pkg-config gtk+-2.0 –cflags` … `pkg-config gtk+-2.0 –libs` 所需的用户构build g++ file.cc -lfoo libfoo.so.0是共享库。 我似乎只能得到这个工作,如果用户构build包括pkg-config gtk+-2.0 … 在创build共享对象的过程中,有没有办法让最终用户不必担心libfoo使用的间接库?
我正在做一些独立于平台的代码的研究,并且发现了dlfcn API。 这是我第一次提到它,并进行了进一步的研究。 现在希望我的经验/平台无关的代码以及编译/链接的经验/理解不会显示在这篇文章中,但对我来说,dlfcn API只是让我们做程序相同的dynamic链接,ld工具。 如果我有误解,请纠正我的错误,因为我想知道。 关于我认识的关于ld工具和dlfcn API的知识,我有一些问题。 使用ld工具与dlfcn APIdynamic链接有什么好处? 我首先想到的是,dlfcn API似乎浪费了我的时间,因为我需要请求函数的指针,而不是检查未定义符号的符号表,然后链接它们。 同样的,ld为我做了一切,而我必须用dlfcn API手工完成所有工作(即打开/加载库,获取函数指针,closures库等)。 但是,乍一看,我认为可能有一些优势。 一个是我们可以在完成使用后加载一个内存不足的内存。 通过这种方式,如果我们知道我们不需要一直使用库,内存就可以得到保存。 我不确定是否有任何“内存/库”pipe理dynamic链接ld的库? 同样,我不确定使用dlfcn API来保存上述内存时,我们会对哪些场景/环境感兴趣,因为看起来在现代系统中这似乎不成问题。 我认为在资源非常非常非常有限的系统上(也许是一些embedded式系统),会使用该库。 还有什么其他的优点或缺点? 什么“编码模式”用于平台无关的代码关于dynamic链接? 如果我是依赖于系统调用的平台独立的代码,我可以看到我自己通过三种风格之一编码来实现平台无关的代码: 逻辑分支直接在我的图书馆代码通过macros。 就像是: void myAwesomeFunction() { … #if defined(_MSC_VER) // Call some Windows system call #elif defined(__GNUC__) // Call some Unix system call … } 创build通用系统调用函数,并在我的库代码中使用这些函数。 就像是: OS_Calls.h void OS_openFile(string myFile) { […]
可能重复: GCC C ++链接器错误:未定义的引用'XXX的虚拟表',未定义的引用'ClassName :: ClassName()' 好吧,我试图编译一个由2个对象文件和一个静态库组成的共享对象库。 我链接到库,但只有Lua实际上在MY对象中使用,其他人在.a文件中使用。 以下是IDE生成的链接步骤: g++ -shared obj/Debug/GL/Window/Window.o obj/Debug/main.o -o bin/Debug/libLOOGL.so -lX11 -lXrandr -lGL -llua5.2 /home/matt/Desktop/Development/LOOGL/lib/bin/OOGL.a 这里是结果的ldd的输出: ldd loogl.so linux-vdso.so.1 => (0x00007fff30b3e000) liblua5.2.so.0 => /usr/lib/x86_64-linux-gnu/liblua5.2.so.0 (0x00007f521b53e000) libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f521b23e000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f521b027000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f521ac68000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f521a96e000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f521a769000) /lib64/ld-linux-x86-64.so.2 (0x00007f521b991000) 必要的库没有链接,结果将不会运行,它缺less引用。
我得到未定义的参考错误,同时用FreeType 2构build一个简单的例子。 gcc `/usr/bin/freetype-config –cflags` `/usr/bin/freetype-config –libs` ac /tmp/ccuSpdkr.o: In function `main': ac:(.text+0x10): undefined reference to `FT_Init_FreeType' collect2: error: ld returned 1 exit status 我在Ubuntu 12.10 x64上。 软件包libfreetype6&libfreetype6-dev已安装。 文件ac是: #include <stdio.h> #include <ft2build.h> #include FT_FREETYPE_H int main() { FT_Library library; FT_Init_FreeType( &library ); return 0; } 我试了2步编译,确保一切都在64位: > gcc -c `/usr/bin/freetype-config –cflags` ac > file […]
我们有一个传统的使用libc5的链接器,由于几个因素,我们只有二进制文件,而不是源文件。 是的,版本控制可以将我们从目前的问题中解救出来……现在正在使用我们完整的工具链和产品线,但是这个特定的马早已不复存在。 这个链接器在Linux内核2.6.24上工作,但在2.6.25(和2.6.26)上,它失败并显示消息 虚拟内存超出“新” 我们对相应的遗留编译器有类似的问题,但有一些stackoverflow.com的答案和许多研究发现,编译器问题是由Linux内核2.6.25中的“brk随机化”引起的。 解决方法是设置一个sysctlvariables和一个环境var: / proc / sys / kernel / randomize_va_space = 0或1 setenv MALLOC_TOP_PAD_ 536870912 但是,这对链接器没有帮助。 我发现从使用“ldd”链接器有更多的共享库依赖项(编译器只有libc.so.5): libg ++。so.27 => /usr/lib/libg++.so.27(0xb7eca000) libstdc ++。so.27 => /usr/lib/libstdc++.so.27(0xb7e99000) libm.so.5 => /lib/libm.so.5(0xb7e90000) libc.so.5 => /lib/libc.so.5(0xb7dd3000) 我已经读过,我可能不得不安装libg ++。so.27的libc5版本。 我犹豫不决,因为我不知道是否会覆盖最新的libg ++。so.27,并导致非libc5应用程序的问题。 那么,我是否可以find并安装libg ++。so.27的libc5版本,还是有一些更好的方法来禁用brk随机化,还是导致链接器问题的内核2.6.24和2.6.25之间还有其他的区别? 编辑 查看这个search的所有细节,以及我的最终决议。
我有一个问题链接一个embedded式目标的应用程序。 我正在使用Min-GW在windows下运行一个在Linux下运行的ARM9目标。 其实我从静态链接切换到dynamic链接.so库以节省内存空间。 我收到错误消息 libT3Printer.so:对`__ASSERT'的未定义引用 我检查了lib的所有来源,我不知道这个函数可以调用的地方。 有没有可能找出谁(哪个源文件或函数)可能是缺less函数的调用者?
我有这个程序,它使用sockets的Boost :: Asio。 我几乎改变了Boost示例中的一些代码。 该程序编译和运行就像它应该在Windows上的VS. 但是,当我在Linux上编译程序并运行它时,出现分段错误。 我在这里发布代码 我用来编译的命令是这样的: c++ -I/appl/htopopt/Linux_x86_64/NTL-5.4.2/include -I/appl/htopopt/Linux_x86_64/boost_1_43_0/include mpqs.cpp mpqs_polynomial.cpp mpqs_host.cpp -o mpqs_host -L/appl/htopopt/Linux_x86_64/NTL-5.4.2/lib -lntl -L/appl/htopopt/Linux_x86_64/gmp-4.2.1/lib -lgmp -lm -L/appl/htopopt/Linux_x86_64/boost_1_43_0/lib -lboost_system -lboost_thread -static -lpthread 通过注释代码,我发现我得到了分段错误由于下面的行: boost::asio::io_service io_service; 任何人都可以提供任何帮助,至于什么可能是问题(和解决scheme)? 谢谢! 编辑:我试图改变程序为一个最小的例子,使用没有其他库或头,只是提升/ asio.hpp: #define DEBUG 0 #include <boost/asio.hpp> int main(int argc, char* argv[]) { boost::asio::io_service io_service; return 0; } 我也删除了其他库包含和编译链接,但是这个最小的例子仍然给我一个分段错误。
我正在使用g++ -lkeyczar -lcrypto -o basic_encrypt -Wall -O2 base_encrypt.cpp来编译下面的代码: #include <cassert> #include <iostream> #include <string> #include <keyczar/keyczar.h> void EncryptAndDecrypt(const std::string& location) { keyczar::Keyczar* crypter = keyczar::Crypter::Read(location); if (!crypter) return; std::string input = "Secret message"; std::string ciphertext; std::cout << "Plaintext: " << input << std::endl; bool result = crypter->Encrypt(input, &ciphertext); if (result) { std::cout << "Ciphertext (Base64w): […]