我正在尝试为项目编写makefile。该项目涉及一个测试程序,它定义了一个用C ++ 11编写的主函数,该函数应该调用用c99编写的共享对象库并运行一些测试。
我的makefile成功编译了c99库并生成" libhanoi.so"。
当我尝试将C99库链接到C ++ 11部分时,出现以下错误:
g++ -std=gnu++11 -L. -lhanoi -o main tests/testing.cpp tests/main.cpp
/tmp/cctHQTcW.o: In function `binarion_constructor(unsigned long*)':
main.cpp:(.text+0x28): undefined reference to `binarion64_t'
collect2: error: ld returned 1 exit status
Makefile:29: recipe for target 'tests' failed
make: *** [tests] Error 1
然而," nm -C libhanoi.so"的输出显示libhanoi.so正在导出binarion64_t函数:
0000000000000610 T binarion64_t(long long, long long)
当我在libhanoi.so的名称中引入拼写错误时,它引入了一个错误,说它无法找到libhanoi.so。
所以它必须能够找到libhanoi.so并且libhanoi.so正在导出main.cpp中未实现的函数,但它仍然提供了一个未定义的引用。发生了什么事?
最小例子:
hanoi.h:
#ifndef HANOI_H
#define HANOI_H
#include <inttypes.h>
// binarion (base -1+i) constructor
uint64_t binarion64_t(long long A, long long B);
#endif // HANOI_H
binarion.c:
#include "hanoi.h"
uint64_t binarion64_t(long long A,long long B){
return 0;
}
main.cpp中:
#include <stdio.h>
extern "C" {
#include "hanoi.h"
};
uint64_t binarion_constructor(uint64_t * args){
return binarion64_t(args[0], args[1]);
}
int main(void){
return 0;
}
编译:
g++ -std=c99 -c binarion.c
g++ -std=c99 -shared -o libhanoi.so binarion.o -lm
g++ -std=gnu++11 -L. -lhanoi -o main main.cpp
输出:
/tmp/ccjoRmCg.o: In function `binarion_constructor(unsigned long*)':
main.cpp:(.text+0x28): undefined reference to `binarion64_t'
collect2: error: ld returned 1 exit status
编辑:
我正在运行的命令是:
gcc -std=c99 -c binarion.c
gcc -std=c99 -shared -o libhanoi.so binarion.o -lm
g++ -std=gnu++11 -L. -lhanoi -o main main.cpp
文件正是问题中的文件。 &#34; readelf -s libhanoi.so |的输出grep binarion&#34;是:
12: 0000000000000660 19 FUNC GLOBAL DEFAULT 11 binarion64_t
33: 0000000000000000 0 FILE LOCAL DEFAULT ABS binarion.c
46: 0000000000000660 19 FUNC GLOBAL DEFAULT 11 binarion64_t
和&#34; g ++ -std = gnu ++ 11 -L的输出。 -lhanoi -o main main.cpp&#34;是:
/tmp/cczfgY8M.o: In function `binarion_constructor(unsigned long*)':
main.cpp:(.text+0x28): undefined reference to `binarion64_t'
collect2: error: ld returned 1 exit status
答案 0 :(得分:0)
TL; DR:
使用:
gcc -std=c99 -c binarion.c
gcc -std=c99 -shared -o libhanoi.so binarion.o -lm
g++ -std=gnu++11 -L. -lhanoi -o main main.cpp
说明:
您应该使用gcc
来编译C文件,g++
用于C ++。当你执行g++ -std=c99 -c binarion.c
时,编译器会给你一个提示:
cc1plus: warning: command line option ‘-std=c99’ is valid for C/ObjC but not for C++
这意味着您最终将库编译为C ++库。您可以致电readelf -s libhanoi.so | grep binarion
:
9: 00000000000005da 19 FUNC GLOBAL DEFAULT 9 _Z12binarion64_txx
29: 0000000000000000 0 FILE LOCAL DEFAULT ABS binarion.c
44: 00000000000005da 19 FUNC GLOBAL DEFAULT 9 _Z12binarion64_txx
正如你所看到的,这个函数已被命名为,这是C ++所做的事情,C不会。
但是,在编译main.cpp
时,您告诉编译器binarion_t
有C链接:
extern "C" {
#include "hanoi.h"
};
所以它正在搜索未编组的binarion_t
(而不是_Z12binarion64_txx
)。