我正在为 pthread API 获取未定义的引用,而我不知道如何解决它们?
以下是该方案:
libA.a - 这是第三方库[它包含许多依赖于pthread的API]
libB.a - 这是我自己的库。我使用的第三方库[libA.a]的API很少,并创建了我自己的库。[我自己没有在libB.a中使用任何pthread API]
我将libA.a + libB.a +(A + B)的标题提供给我的客户端exe。 - 说MAIN.exe
MAIN.cpp - 将使用我的图书馆提供的API。
当我尝试运行MAIN.exe时,我收到了未定义的引用错误。
以下是源代码:
libA.a:它只包含A.h和A.cpp
class A
{
public:
void dispA();
void printNumber();
};
#include "iostream"
#include "A.h"
#include<stdlib.h>
#include "pthread.h"
using namespace std;
void* printNum(void*)
{
sleep(1);
for(int i = 1; i<= 10; i++)
{
cout<<"i: "<<i<<endl;
}
pthread_exit(NULL);
return NULL;
}
void A::dispA()
{
cout<<"A::disp()"<<endl;
}
void A::printNumber()
{
pthread_t t1;
pthread_create(&t1, NULL, &printNum, NULL);
pthread_exit(NULL);
}
cd / practice / A
g ++ -c A.cpp
ar -cvq libA.a * .o
libB.a:它只包含B.h和B.cpp
class B
{
public:
void funB();
void dispB();
};
#include "B.h"
#include "iostream"
#include "A.h"
using namespace std;
void B::funB()
{
cout<<"B::funB()"<<endl;
}
void B::dispB()
{
A a;
a.dispA();
a.printNumber();
}
创建libB.a的命令:
cd / practice / B
g ++ -c B.cpp -I ../ A
ar -cvq libB.a * .o
#include "iostream"
#include "B.h"
using namespace std;
int main()
{
B b;
b.dispB();
b.funB();
return 0;
}
创建main.exe的命令:
cd / practice / MAIN
g ++ -o noThread MAIN.cpp -I ../ A -I ../ B -L ../ A -L ../ B -lB -lA
我得到的错误:
../A/libA.a(A.o):在函数A::printNumber()':
A.cpp:(.text+0x8c): undefined reference to
pthread_create&#39;
collect2:ld返回1退出状态
注意: 我知道,如果我尝试使用-lrt标志,它不会给出任何错误。 但问题是我的客户端[MAIN.cpp]不能使用-lrt标志或-lpthread或任何线程相关的库。因此,他建议我提供单线图书馆。
那么,如何提供单线程库?
libA.a是第三方,我无法更改其代码。 libB.a是我自己的库[我必须使用来自libA.a的API]
是否有任何特定的标志可用于使main.cpp正常运行?
另一个疑问:
为什么Main.cpp给我错误,即使客户端只调用线程无关函数:
int main()
{
B b;
//b.dispB(); <== commented thread dependent function
b.funB(); <== this doesn't depend on pthread. but still main.cpp is failing. Don't know WHY !!
return 0;
}
答案 0 :(得分:1)
如果您确定没有从您的库使用的代码路径调用实际pthread
代码,那么您可以尝试制作ptherad
调用的虚拟版本,如下所示:
DummyPThreads.c (注意c不是c ++)
int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void *), void*)
{
return 0;
}
void pthread_exit(void*)
{
}
// etc...
编译:
gcc -c -o DummyPThreads.o DummyPThreads.c
添加到您的应用程序:
g++ -o noThread MAIN.cpp -I../A -I../B DummyPThreads.o -L../A -L../B -lB -lA
答案 1 :(得分:0)
这是不可能的。由于其中一个库依赖于pthread,因此您需要将库链接到最终的可执行文件。
唯一的选择是从libA.a中提取你真正需要的文件,它们不依赖于pthread。但是要完成这项艰巨的任务,很可能不可能,因为通常存在交叉依赖关系,最后但并非最不重要的是,如果库更改,则会非常脆弱。