Linux C++.链接共享对象和主对象

linux C++. Link shared objects and main

本文关键字:对象 共享 C++ 链接 Linux      更新时间:2023-10-16

我用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:创建共享对象时不能使用针对".rodata"的重定位R_X86_64_32;使用 -fPIC
重新编译 dll.o:添加符号时出错:值
错误 collect2:错误:ld 返回 1 个退出状态
生成文件:8:目标"dll.so"配方失败
生成:*** [dll.so] 错误 1

我做了什么不对?
附言我在Ubuntu Server 14.04.3上使用GNU Make 3.81 GNU GCC 4.8.4

更新
如果我使用 -fPIC 参数链接dll.so文件,我会遇到同样的错误

首先,有点跑题了,但是在您的makefile中,最好将build_all指定为虚假目标

.PHONY: build_all

接下来,您将编译dll.cpp而不使用可重定位的代码。您需要添加-fpic-fPIC(有关差异的说明,请参阅此处(。

$(CXX) -c dll.cpp -fpic

最后,unix 不会自动添加文件后缀,所以这里你需要指定.so

$(CXX) -shared -o dll.so dll.o