linux C++。 Link 共享对象和主要
linux C++. Link shared objects and main
我用C++写了一个简单的测试程序,它会告诉Hello, Alex
然后退出。
这是代码:
main.cpp
:
#include <iostream>
#include <dlfcn.h>
int main()
{
void* descriptor = dlopen("dll.so", RTLD_LAZY);
std::string (*fun)(const std::string name) = (std::string (*)(const std::string)) dlsym(descriptor, "sayHello");
std::cout << fun("Alex") << std::endl;
dlclose(descriptor);
return 0;
}
dll.h
:
#ifndef UNTITLED_DLL_H
#define UNTITLED_DLL_H
#include <string>
std::string sayHello(const std::string name);
#endif
dll.cpp
:
#include "dll.h"
std::string sayHello(const std::string name)
{
return ("Hello, " + name);
}
makefile
:
build_all : main dll.so
main : main.cpp
$(CXX) -c main.cpp
$(CXX) -o main main.o -ldl
dll.so : dll.h dll.cpp
$(CXX) -c dll.cpp
$(CXX) -shared -o dll dll.o
但是当我用 make 构建我的代码时,我有这样的错误:
/usr/bin/ld: dll.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
dll.o: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
makefile:8: recipe for target 'dll.so' failed
make: *** [dll.so] Error 1
我哪里做错了?
P.S。我在 Ubuntu Server 14.04.3
上使用 GNU Make 3.81
和 GNU GCC 4.8.4
更新
如果我 link dll.so
文件带有 -fPIC 参数,我有同样的错误
首先,有点跑题了,但在你的 makefile 中,最好将 build_all 指定为假目标
.PHONY: build_all
接下来,您将在没有可重定位代码的情况下编译 dll.cpp
。您需要添加 -fpic
或 -fPIC
(有关差异的解释,请参阅 here)。
$(CXX) -c dll.cpp -fpic
最后,unix不会自动添加文件后缀,所以这里需要指定.so
:
$(CXX) -shared -o dll.so dll.o
我用C++写了一个简单的测试程序,它会告诉Hello, Alex
然后退出。
这是代码:
main.cpp
:
#include <iostream>
#include <dlfcn.h>
int main()
{
void* descriptor = dlopen("dll.so", RTLD_LAZY);
std::string (*fun)(const std::string name) = (std::string (*)(const std::string)) dlsym(descriptor, "sayHello");
std::cout << fun("Alex") << std::endl;
dlclose(descriptor);
return 0;
}
dll.h
:
#ifndef UNTITLED_DLL_H
#define UNTITLED_DLL_H
#include <string>
std::string sayHello(const std::string name);
#endif
dll.cpp
:
#include "dll.h"
std::string sayHello(const std::string name)
{
return ("Hello, " + name);
}
makefile
:
build_all : main dll.so
main : main.cpp
$(CXX) -c main.cpp
$(CXX) -o main main.o -ldl
dll.so : dll.h dll.cpp
$(CXX) -c dll.cpp
$(CXX) -shared -o dll dll.o
但是当我用 make 构建我的代码时,我有这样的错误:
/usr/bin/ld: dll.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
dll.o: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
makefile:8: recipe for target 'dll.so' failed
make: *** [dll.so] Error 1
我哪里做错了?
P.S。我在 Ubuntu Server 14.04.3
上使用 GNU Make 3.81
和 GNU GCC 4.8.4
更新
如果我 link dll.so
文件带有 -fPIC 参数,我有同样的错误
首先,有点跑题了,但在你的 makefile 中,最好将 build_all 指定为假目标
.PHONY: build_all
接下来,您将在没有可重定位代码的情况下编译 dll.cpp
。您需要添加 -fpic
或 -fPIC
(有关差异的解释,请参阅 here)。
$(CXX) -c dll.cpp -fpic
最后,unix不会自动添加文件后缀,所以这里需要指定.so
:
$(CXX) -shared -o dll.so dll.o