linux C ++。链接共享对象和主要

时间:2017-04-05 19:57:08

标签: c++ linux makefile shared-libraries gnu-make

我用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&#39;重新定位R_X86_64_32制作共享对象时不能使用;用-fPIC重新编译
  dll.o:错误添加符号:错误值
  collect2:错误:ld返回1退出状态
  makefile:8:目标配方&#39; dll.so&#39;失败
  make:*** [dll.so]错误1

我做的不正确?
附:我在GNU Make 3.81上使用Ubuntu Server 14.04.3 GNU GCC 4.8.4

更新
如果我将dll.so文件与-fPIC param链接,我有同样的错误

1 个答案:

答案 0 :(得分:2)

首先,有点偏离主题,但在你的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