我需要构建一个静态链接 libc 的二进制文件。我在与源代码相同的目录中提供了 libc.a 。为了编译,我尝试了以下操作:
gcc -o foo foo.c libc.a
Run Code Online (Sandbox Code Playgroud)
这导致了以下问题:
/usr/bin/ld: dynamic STT_GNU_IFUNC symbol `strcmp' with pointer equality in `libc.a(strcmp.o)' can not be used when making an executable
Run Code Online (Sandbox Code Playgroud)
在研究这个问题时,我发现了以下问题:Linking Partial static and Partially Dynamic in GCC
按照顶部答案中的解决方案,我创建了自己的字符串比较函数my_strcmp.c并尝试了以下编译:
gcc -o foo foo.c mystrcmp.c libc.a
Run Code Online (Sandbox Code Playgroud)
它确实有效,但是二进制文件现在很早就出现了段错误。如果没有静态链接 libc,这种情况就不会发生。这是 GDB 跟踪:
(gdb) backtrace
#0 0x00000000004fe48e in generic_start_main ()
#1 0x00000000004fe891 in __libc_start_main ()
#2 0x0000000000406b56 in _start ()
Run Code Online (Sandbox Code Playgroud)
不太确定如何解释这一点。有人有主意吗?
在写这个问题之前,我想强调一下,我自己做了几周的研究,阅读了数十篇文章,但这个问题仍然没有解决,而且我得到的解释根本没有意义(也许是因为我是链接世界的新手) )。所以我希望有人能提供简单但非常详细的答案。
我知道 GOT(全局偏移表)可以帮助我们解析动态链接中从另一个引用的全局符号。另外我读到:“每个共享库都有自己的 GOT”
但这是有问题的,如果两个程序使用同一个共享库怎么办?两者对于全局变量都有相同的值,但事实不应该如此。
至于我的主要问题:如果我不想使用惰性绑定,那么为什么我们需要 PLT,为什么不直接使用普通的 GOT 来处理变量呢?
我有一个静态链接到库(libA.2.0.a)的程序,并动态链接到另一个库(libB.so).libB.so还动态链接到旧版本的libA(libA.1.0.so).
这种配置是否可行?如果是这样,系统怎样知道从使用符号libA.2.0.a我的程序,并从符号libA.1.0.so的libB.so?
我有一个单例类,我将它编译为库静态(lib)或动态(dll).
是否可以保证在两种情况下对机器中同一文件的调用始终引用相同且唯一的实例?
编辑:如果进程加载两个不同的库,并且这些库中的不同函数想要使用单例类的实例,该怎么办?现在,他们正在访问同一个实例,对吗?
谢谢,
使用multiple.h和.cu文件编译静态库时,我得到一个未解析的extern函数.这是一个复制错误的简短示例.
看来我不能让Nsight Eclipse Edition先编译extrafunctions.cu.在我的整个项目有额外功能的文件被编译第一,但它仍然抛出无法解决外部函数错误.
以下是此示例的输出:
**** Build of configuration Debug for project linkerror ****
make all
Building file: ../cudatest.cu
Invoking: NVCC Compiler
nvcc -I/usr/local/cuda/include -G -g -O0 -gencode arch=compute_30,code=sm_30 -odir "" -M -o "cudatest.d" "../cudatest.cu"
nvcc --compile -G -I/usr/local/cuda/include -O0 -g -gencode arch=compute_30,code=compute_30 -gencode arch=compute_30,code=sm_30 -x cu -o "cudatest.o" "../cudatest.cu"
../cudatest.cu(19): warning: variable "devInts" is used before its value is set
../cudatest.cu(19): warning: variable "devInts" is used before its value is set
ptxas fatal : Unresolved extern function …Run Code Online (Sandbox Code Playgroud) 当我在MacOS 64bit上编译SQLCIPHER时
./configure --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC -DSQLITE_TEMP_STORE=2" LDFLAGS="/Users/administrator/Documents/openssl/lib/libcrypto.a"
Run Code Online (Sandbox Code Playgroud)
我得到32位lib libsqlite3.a但我需要64位libsqlite3.a
我怎么能这样做?
我创建了一个静态库,但我无法导入它.以下是我将其添加到项目中的步骤.
1)从finder中,我将我的库.xcodeproj拖到我的主项目中.
2)我选择了主项目,去了目标,然后建立阶段.
3)我在Link Binary With Libraries and Target Dependencies下添加了库.
4)在Build Settings - Header Search Paths下,我补充道$(BUILT_PRODUCTS_DIR).
5)我也加入-ObjC了Other Linker Flags.
但是,当我尝试导入库时,它不被识别.有人能帮忙吗?
我正在使用一个我没有问题的库(Astro.lib)(我想这是一个发布版本).
我还内置了一个项目,引用库(它会作为一个发布EXE罚款),但因为我得到的消息"无法启动程序'Astro.lib’我不能调试项目.
如果我尝试调试lib然后我得到相同的错误,所以我猜它与没有构建调试我的lib但不知道如何修改有关.
我尝试使用MSDN信息更改属性页但不确定我是否正在解决正确的问题.我应该对链接项目库的属性页进行哪些更改?
提前致谢
我正在为项目编写构建系统,我不确定可执行文件,静态库和共享库之间的链接.
对我来说有三个肯定:
关于第三次肯定,我仍然怀疑......
你能告诉我这件事吗?
我想知道使用哪个编译器来编译C ++中的特定库是否很重要?因为我听说过ABI兼容性,所以很好奇它是否重要!
例如,我可以下载用MSVC编译的Windows的OpenCV二进制文件(包括dll和lib),并在用MinGW编译的另一个代码中使用它们吗?