我有3个小文件用于制作静态库和应用程序:
test.h
#ifndef TEST_H
#define TEST_H
class Test
{
public:
Test();
};
extern Test* gpTest;
#endif
TEST.CPP
#include "test.h"
Test::Test()
{
gpTest = this;
}
Test test;
的main.cpp
#include "test.h"
#include <iostream>
using namespace std;
Test* gpTest = NULL;
int main()
{
return 0;
}
构建
g++ -c test.cpp -o test.o
ar cr test.a test.o
g++ -c main.cpp -o main.o
g++ main.o -o app -Wl,--whole-archive -L/home/dumindara/intest/test.a -Wl,-no--whole-archive
错误(关联步骤)
/usr/lib64/gcc/x86_64-suse-linux/4.3/../../../../x86_64-suse-linux/bin/ld: cannot find -lgcc_s
collect2: ld returned 1 exit status
我尝试了一切:使用-static-libgcc并链接到静态libstdc ++。无法让这个工作。这完全归功于--whole-archive标志。但我离不开它。
答案 0 :(得分:7)
你有一个错字。 -no - 整个档案应该是--no-whole-archive。修复拼写错误修复了链接器错误。
答案 1 :(得分:5)
我认为--
是问题所在:
-Wl,-no--whole-archive
尝试
-Wl,-no-whole-archive
修改强>
关于不在应用中使用nm应用看到测试符号:我认为您不需要-L
,因为您提供了test.a的完整路径和名称 - 请执行
-Wl,--whole-archive -L/home/dumindara/intest/ -ltest -Wl,-no-whole-archive
或
-Wl,--whole-archive /home/dumindara/intest/test.a -Wl,-no-whole-archive
答案 2 :(得分:4)
关于到目前为止的评论:只需删除-Wl选项 完全。让g ++做它的事。
至于没有找到nm的符号测试,为什么你会期望 还要别的吗?你不使用它,你的程序不需要它, 所以它没有被拉入。(如果由于某种原因你需要包括 未被引用的目标文件,例如因为静态 初始化程序将使其可见,然后指定对象 文件---不要把它放在库中,这是标准的方法 说除非需要,否则不要包含它。)
- 詹姆斯坎泽
答案 3 :(得分:0)
整个归档工作,你只是没有链接lib。正确的做法是:
ar cr libtest.a test.o
并与
相关联-Wl,--whole-archive -L/home/dumindara/intest/ -ltest
答案 4 :(得分:0)
请注意:整个存档仅适用于静态库( .a),而不是共享库( .so)是我的经验。