假设我们有一个名为"my_app"的主要可执行文件,它使用了其他几个库:3个库是静态链接的,其他3个是动态链接的.它们应该以哪种顺序与"my_app"相关联?
但这些顺序应该以哪种顺序联系起来?
假设我们得到了依赖于libSB的libSA(如在静态A中),以及依赖于libSB的libSC:
libSA -> libSB -> libSC
Run Code Online (Sandbox Code Playgroud)
和三个动态链接库:libDA -> libDB -> libDC(libDA是基本的,libDC是最高的)
这些顺序应该链接在哪?第一个还是最后一个?
g++ ... -g libSA libSB libSC -lDA -lDB -lDC -o my_app
Run Code Online (Sandbox Code Playgroud)
看起来像现在的顺序,但是这样吗?如果任何动态库与静态库或其他方式之间存在依赖关系,该怎么办?
c++ linker shared-libraries dynamic-linking static-libraries
我正在尝试使用cpputest构建一个简单的单元测试可执行文件.我已将cpputest框架构建到静态库中,现在正尝试将其链接到可执行文件中.但是,由于相关代码,我陷入了相当复杂的Makefile设置.
这是我的命令行:
/usr/bin/qcc -V4.2.4,gcc_ntoarmle_acpp-ne -lang-c++ -O2 -g -g -o Application/UnitTests/Tests/symbols/UnitTestExe -Wl,--start-group Application/UnitTests/Tests/../.objs/main.o Application/UnitTests/lib/libcpputest.a -Wl,--end-group -lm
Run Code Online (Sandbox Code Playgroud)
我收到很多错误,如下所示:
Application/UnitTests/lib/libcpputest.a(CommandLineTestRunner.o): In function `CommandLineTestRunner::parseArguments(TestPlugin*)':
Application/UnitTests/cpputest/src/CppUTest/.objs/../CommandLineTestRunner.cpp:114: undefined reference to `operator new(unsigned int, char const*, int)'
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚造成这种情况的原因.我不是用C++免费获得operator new吗?
我将Ubuntu升级(10.11, 11.04 i dont know)到11.10 后出现了一些奇怪的错误.
我正在undefined reference to 'sqrt'使用math.h 并使用-lm进行链接
我正在编译gcc -Wall -Werror -g -Iinclude/ -lm lib/matrix.c src/analyse.c -o bin/analyse.o两个源文件使用并包括math.h.
这段代码编译没有问题,自升级以来我没有太大变化,但现在它不起作用.
你有什么建议我可以做,找到错误?
对不起,如果以前问过这个问题; 关于数学链接器错误的帖子太多了,我找不到匹配的错误
我正在编写一个使用librt的小型C程序.如果我将链接标志放在开头而不是结尾处,那么程序将无法编译,我感到非常惊讶:
目前,要编译我执行的程序:
gcc -o prog prog.c -lrt -std=gnu99
如果我要执行以下操作,它将无法在librt中找到函数:
gcc -std=gnu99 -lrt -o prog prog.c
然而,这适用于其他图书馆.我在尝试使用简单的Makefile时发现了这个问题.make实际编译prog.c而不首先喜欢(使用-c标志),然后进行链接.
这是Makefile:
CC = gcc
CFLAGS = -std=gnu99
LIBS= -lrt
LDFLAGS := -lrt
prog: prog.o
$(CC) -o prog prog.c -lrt -std=gnu99
Run Code Online (Sandbox Code Playgroud)
输入make时我得到的输出是:
gcc -std=gnu99 -c -o prog.o prog.c
gcc -lrt prog.o -o prog
prog.o: In function `main':
prog.c:(.text+0xe6): undefined reference to `clock_gettime'
prog.c:(.text+0x2fc): undefined reference to `clock_gettime'
collect2: ld returned 1 exit status
make: *** [buff] Error 1
Run Code Online (Sandbox Code Playgroud)
我现在已经制作了一个Makefile,它将链接放在gcc行的末尾,但是我很困惑,如果链接标志位于开头,它为什么不起作用.
如果有人能向我解释,我将不胜感激.谢谢.
我试图在Linux上使用GCC 4.4.5,CMake 2.8.2和Boost 1.53.0运行一个简单的boost.log示例.
编译boost和boost日志成功,但在将测试程序链接到boost.log时,我一直遇到问题.
我使用以下CMakeLists.txt文件:
cmake_minimum_required(VERSION 2.8)
project(QuantibBoostLogTest)
# Include boost headers
set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_MULTITHREADED ON)
find_package(Threads)
find_package(Boost 1.53.0 COMPONENTS thread date_time filesystem system log log_setup REQUIRED)
if(Boost_FOUND)
include_directories( ${Boost_INCLUDE_DIRS} )
link_libraries(${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES})
else(Boost_FOUND)
message(FATAL_ERROR "Cannot build Quantib Boost Log test without Boost. Please set Boost_DIR.")
endif(Boost_FOUND)
add_executable(quantibBoostLogTest boost_log_test.cxx)
install(TARGETS quantibBoostLogTest DESTINATION .)
Run Code Online (Sandbox Code Playgroud)
CMake确实正确检测了boost库,但我仍然遇到链接器错误,主要是以下形式:
core.cpp:(.text+0x1b0e): undefined reference to `boost::detail::get_tss_data(void const*)'
Run Code Online (Sandbox Code Playgroud)
我链接线程库.有人知道如何解决这个问题吗?
两个共享库liba.so和libb.so. liba.so使用libb.so. 所有c文件都使用-fPIC编译.链接使用-shared.当我们在liba.so上调用dlopen时,它无法在libb.so中找到符号...我们得到"未定义符号"错误.我们可以dlopen libb.so没有错误.我们知道liba正在寻找libb,因为我们没有找到找不到文件的错误.删除libb.so时,我们收到文件未找到错误.我们试过 - 但没有运气.
有任何想法吗????
哦耶.gcc 4.1.2
更新:我们在链接liba时使用rpath,因此可以找到libb.
ldd liba.so返回:
linux-gate.so.1 => (0xffffe000)
libb.so => ./libb.so (0xf6ef9000) <-------- LIBB
libutil.so.1 => /lib/libutil.so.1 (0xf6ef5000)
libdl.so.2 => /lib/libdl.so.2 (0xf6ef1000)
libm.so.6 => /lib/libm.so.6 (0xf6ec9000)
libpthread.so.0 => /lib/libpthread.so.0 (0xf6eb1000)
librt.so.1 => /lib/librt.so.1 (0xf6ea8000)
libc.so.6 => /lib/libc.so.6 (0xf6d62000)
/lib/ld-linux.so.2 (0x007d0000)
Run Code Online (Sandbox Code Playgroud)
在libb的末尾没有.#是有意义的吗?
一旦我将Ubuntu发行版升级到11.10,我就开始看到gcc的奇怪链接器行为.我能够通过将我的-l参数移动到gcc命令的末尾来修复问题(我的问题类似于此线程中描述的问题,并且建议的解决方案对我有用......谢谢!).
我的问题是......为什么我现在才有这个问题?我已经在OS X和Ubuntu上开发和测试了这段代码了一段时间:我从来不知道-l命令应该在你的.c文件之后,但即便如此,这从来没有给我带来过问题.我猜它与GCC版本有关,而不是Ubuntu版本.
这个新版本是否比早期版本更严格地执行此要求?
好吧,这只是一个有趣的练习,但是对于一些较旧的Linux系统来说编译程序不是太难,或者可以吗?
我可以访问几个运行linux的古老系统,也许看看它们在负载下的表现会很有趣.举个例子,我们想用Eigen做一些线性代数,这是一个很好的只有头的库.有没有机会在目标系统上编译它?
user@ancient:~ $ uname -a
Linux local 2.2.16 #5 Sat Jul 8 20:36:25 MEST 2000 i586 unknown
user@ancient:~ $ gcc --version
egcs-2.91.66
Run Code Online (Sandbox Code Playgroud)
也许不是......所以让我们在当前系统上编译它.以下是我的尝试,主要是失败的.更多的想法非常受欢迎.
编译 -m32 -march=i386
user@ancient:~ $ ./a.out
BUG IN DYNAMIC LINKER ld.so: dynamic-link.h: 53: elf_get_dynamic_info: Assertion `! "bad dynamic tag"' failed!
Run Code Online (Sandbox Code Playgroud)编译-m32 -march=i386 -static:运行在所有相当新的内核版本上,但如果它们稍微更旧并且具有众所周知的错误消息则会失败
user@ancient:~ $ ./a.out
FATAL: kernel too old
Segmentation fault
Run Code Online (Sandbox Code Playgroud)
这是一个glibc错误,它支持最小内核版本,例如我的系统上的内核2.6.4:
$ file a.out
a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),
statically linked, for GNU/Linux …Run Code Online (Sandbox Code Playgroud)我正在尝试阅读本教程:http: //www.tcpdump.org/pcap.html
现在我使用以下命令安装pcap(代码提示和所有工作):
sudo apt-get install libpcap-dev
Run Code Online (Sandbox Code Playgroud)
到目前为止,我有以下代码(文件名是example_pcap.c):
#include <stdio.h>
#include <pcap.h>
int main(int argc, char *argv[]) {
char *dev, errbuf[PCAP_ERRBUF_SIZE];
dev = pcap_lookupdev(errbuf);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
根据我已经看到的许多问题,他们说使用这个编译它:
gcc -lpcap example_pcap.c -o example_pcap
Run Code Online (Sandbox Code Playgroud)
但是我仍然收到以下错误:
example_pcap.c:(.text+0x32): undefined reference to `pcap_lookupdev'
Run Code Online (Sandbox Code Playgroud) 我想在c ++程序中调用一些Haskell函数.
为了做到这一点,我已经应用了这些 指令并将它们改编为我的代码和系统.
我目前所拥有的是以下内容:
make文件如下:
CPP_SOURCES = main.cpp textures.cpp cpp/game.cpp \
cpp/piece.cpp cpp/factories.cpp cpp/utils.cpp
HASKELL_SOURCES = haskell/hello.hs
all: main; ./main
main: $(CPP_SOURCES) HaskellPart.o; g++ \
-lsfml-graphics \
-lsfml-window \
-lsfml-system \
-I/usr/lib/ghc/include \
-liconv \
-I/usr/lib/ghc/ghc-8.0.1/include \
-L/usr/lib/ghc/ghc-8.0.1 \
-L/usr/lib/ghc/rts \
-lHSrts \
-L/usr/lib/ghc/base-4.9.0.0 \
-lHSbase-4.9.0.0 \
-L/usr/lib/ghc/ghc-prim-0.5.0.0 \
-lHSghc-prim-0.5.0.0 \
-L/usr/lib/ghc/integer-gmp-1.0.0.1 \
-lHSinteger-gmp-1.0.0.1 \
-lHSghc-prim-0.5.0.0 \
-fno-stack-protector \
-Wall \
-o main $(CPP_SOURCES) haskell/hello.o
HaskellPart.o: $(HASKELL_SOURCES); ghc -fforce-recomp -fPIC …Run Code Online (Sandbox Code Playgroud)