我正在创建一个C++共享库,当我编译一个使用该库的主exe时,编译器给了我:
main.cpp:(.text+0x21): undefined reference to `FooClass::SayHello()'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
图书馆代码:
fooclass.h
#ifndef __FOOCLASS_H__
#define __FOOCLASS_H__
class FooClass
{
public:
char* SayHello();
};
#endif //__FOOCLASS_H__
Run Code Online (Sandbox Code Playgroud)
fooclass.cpp
#include "fooclass.h"
char* FooClass::SayHello()
{
return "Hello Im a Linux Shared Library";
}
Run Code Online (Sandbox Code Playgroud)
编译:
g++ -shared -fPIC fooclass.cpp -o libfoo.so
Run Code Online (Sandbox Code Playgroud)
主要:main.cpp
#include "fooclass.h"
#include <iostream>
using namespace std;
int main(int argc, char const *argv[])
{
FooClass * fooClass = new FooClass();
cout<< fooClass->SayHello() << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译:
g++ -I. -L. …Run Code Online (Sandbox Code Playgroud) 我试图在c中连接到rabbitmq并且每次都失败了.我就是这样做的.
下载rabbitmq-c
安装it(make && make install)只是为了确保满足依赖性.
修改后的连接变量amqp_sendstring.c
使用make,运行./amqp_sendstring和工作
然后我开始创建自己的文件并通过gcc编译它们使用:
gcc -lrabbitmq -o j_test test.c
Run Code Online (Sandbox Code Playgroud)
具有讽刺意味的是,它无法与librabbitmq链接以下错误:
/tmp/cc63IlXq.o: In function `main':
test.c:(.text+0xa): undefined reference to `amqp_new_connection'
test.c:(.text+0x1a): undefined reference to `amqp_destroy_connection'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我从ampq_*开始删除了所有内容.瞧!它成功建成.这对我来说是gcc能够找到头而不是lib的指示器.
这是test.c源代码:
#include <amqp.h>
#include <amqp_framing.h>
int main(int argc, char const * const *argv) {
amqp_connection_state_t conn;
conn = amqp_new_connection();
amqp_destroy_connection(conn);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有人请指出我正确的方向吗?
编辑:我忘了提到我在ubuntu盒子(12.04).认为它隐含在上述陈述中.
我想在我的项目中包含这个文件:http://cairo.sourcearchive.com/documentation/1.9.4/backtrace-symbols_8c-source.html
但它需要与BFD链接.我有两个binutils并binutils-devel安装.我已经尝试过连接-lbfd以及直接连接/usr/lib64/libbfd.so和/usr/lib64/libbfd.a(两者都存在).我也试图寻找pkg-config,看看是否有我应该使用不同的标志,但目前还BFD或没有提及binutils在pkg-config.
无论我尝试过什么,我都会遇到以下错误:
undefined reference to 'bfd_init'
undefined reference to 'bfd_openr'
undefined reference to 'bfd_check_format'
undefined reference to 'bfd_checkformat_matches'
undefined reference to 'bfd_close'
undefined reference to 'bfd_map_over_sections'
Run Code Online (Sandbox Code Playgroud)
首先,我正在编译我的记录器和backtrace-symbols.c上面链接的文件(因为记录器是我打算用它来打印痕迹的地方).然后我将这两个目标文件一起链接到一个组合的目标文件中:
CC = clang
CFLAGS = -g -Wall -c
SOURCE = simplog.c
OBJ = simplog.o, simplog-temp.o, backtrace-symbols.o
all:
$(CC) $(CFLAGS) $(SOURCE); mv simplog.o simplog-temp.o; \
$(CC) -ansi $(CFLAGS) backtrace-symbols.c; \
ld -r …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用CMake使用hwloc编译项目.但是,链接时我收到大量未定义的引用错误:
undefined reference to `hwloc_get_type_depth'
undefined reference to `hwloc_bitmap_zero'
[...]
Run Code Online (Sandbox Code Playgroud)
根据对类似问题的回答,标志的顺序很重要.
那么,我如何在CMake中生成这样的命令?:
g++ -Wall -std=c++11 source.cpp-lhwloc
摘自我的CMakeLists.txt:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11 -lhwloc")
set(SOURCE_FILES source.cpp)
add_executable(source ${SOURCE_FILES})
Run Code Online (Sandbox Code Playgroud)
任何帮助是极大的赞赏!
编辑:我的问题,提出了作为一个可能重复这一块,但是我想补充的旗子是为似乎是在上面提到的问题的情况下对一个库,而不是链接正常编译标志.@Edgar Rokyan为我的问题提供了正确的答案.