相关疑难解决方法(0)

g ++:静态和动态库应该以什么顺序链接?

假设我们有一个名为"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

24
推荐指数
3
解决办法
2万
查看次数

对运算符new的未定义引用

我正在尝试使用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吗?

c++ linker gcc

22
推荐指数
3
解决办法
4万
查看次数

在Ubuntu 11.10上的数学链接器问题

我将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.

这段代码编译没有问题,自升级以来我没有太大变化,但现在它不起作用.

你有什么建议我可以做,找到错误?

对不起,如果以前问过这个问题; 关于数学链接器错误的帖子太多了,我找不到匹配的错误

c ubuntu linker gcc math.h

21
推荐指数
3
解决办法
3万
查看次数

为什么库链接器标志有时必须使用GCC结束?

我正在编写一个使用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行的末尾,但是我很困惑,如果链接标志位于开头,它为什么不起作用.

如果有人能向我解释,我将不胜感激.谢谢.

c c++ linux posix makefile

21
推荐指数
2
解决办法
4859
查看次数

提升日志,GCC 4.4和CMake

我试图在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)

我链接线程库.有人知道如何解决这个问题吗?

c++ linux gcc boost cmake

15
推荐指数
2
解决办法
6579
查看次数

Linux共享库,它使用共享库未定义的符号

两个共享库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的末尾没有.#是有意义的吗?

linux gcc shared

14
推荐指数
1
解决办法
4万
查看次数

使用gcc链接库:参数的顺序

一旦我将Ubuntu发行版升级到11.10,我就开始看到gcc的奇怪链接器行为.我能够通过将我的-l参数移动到gcc命令的末尾来修复问题(我的问题类似于此线程中描述的问题,并且建议的解决方案对我有用......谢谢!).

我的问题是......为什么我现在才有这个问题?我已经在OS X和Ubuntu上开发和测试了这段代码了一段时间:我从来不知道-l命令应该在你的.c文件之后,但即便如此,这从来没有给我带来过问题.我猜它与GCC版本有关,而不是Ubuntu版本.

这个新版本是否比早期版本更严格地执行此要求?

ubuntu gcc libraries

14
推荐指数
1
解决办法
7255
查看次数

如何将c/c ++应用程序移植到旧版Linux内核版本

好吧,这只是一个有趣的练习,但是对于一些较旧的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)

也许不是......所以让我们在当前系统上编译它.以下是我的尝试,主要是失败的.更多的想法非常受欢迎.

  1. 编译 -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)
  2. 编译-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)

c++ linux gcc glibc linux-kernel

14
推荐指数
2
解决办法
5053
查看次数

Pcap函数有"未定义的引用"

我正在尝试阅读本教程: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 linux pcap undefined-reference libpcap

11
推荐指数
1
解决办法
1万
查看次数

连接Haskell和C++

我想在c ++程序中调用一些Haskell函数.

为了做到这一点,我已经应用了这些 指令并将它们改编为我的代码和系统.

我目前所拥有的是以下内容:

  • Main.cpp的
  • 共享头文件和cpp文件
  • 生成文件
  • CPP /
    • 一些cpp和头文件
  • 哈斯克尔/
    • hello.hs

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)

c++ haskell g++ ghc

11
推荐指数
1
解决办法
550
查看次数