【问题标题】:Linking library C++链接库 C++
【发布时间】:2020-05-19 13:14:36
【问题描述】:

我正在努力将一个项目链接到一个外部项目(名为 Prog)。 我不习惯大项目和依赖问题,这是我第一次遇到这样的问题链接另一个库。

我想将此库作为静态库或更好的库作为 MyProject 的动态库包含在内。 Prog 的编译为我提供了静态库(“.a”),我将它们包含在我的“基本”Makefile 中,这是它的图片:

Makefile :

CXX = g++
SRCS = $(shell find . -name "*.cpp")
OBJS = $(addsuffix .o, $(basename $(SRCS))
EXEC = test
CXXFLAGS += -std=c++17 -O3 

LIBS = -L/usr/include/lib -lprogvcore \
       -lpthread -lz -lm


CXXFLAGS += -I/usr/local/include/code \
            -std=c++11 -O3


all : $(EXEC)

$(EXEC): $(OBJS) 
    @$(CXX) -o $@ $^ $(CXXFLAGS) $(LIBS)


%.o: %.cpp 
    @$(CXX) -o $@ -c $< $(CXXFLAGS) $(LIBS)

.PHONY: clean mrproper

clean:
        @rm -f $(OBJS)

mrproper: clean
        @rm -rf $(EXEC)

这是项目层次结构的图片:

MyProject
|
|
|------ TESTMain.cpp
|
|------ TESTFILES_THAT_USE_PROG_FUNCTIONS
|                    |
|                    |------ MC 
|                    |             |
|                    |             |------- PROG.cpp
|                    |             |------- PROG.h 
|
|------ PROG-Project
|
|------ Makefile

当我运行时,编译器会识别 PROG 文件的头文件,但是当我想使用 PROG 函数时,它会返回:

MC/PROG.o : In function « PROG::createModel(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >) » :
/home/git/test/test-src/MC/PROG.cpp:37 : underfined reference to « PROGCore_init_data() »
/home/git/test/test-src/MC/PROG.cpp:41 : underfined reference to « PROGCore_init(PROGEnv_TAG*, void (* (*) [2])(PROGEnv_TAG*), int) »
collect2: error: ld returned 1 exit status
Makefile:46: recipe for target 'test' failed
make: *** [test] Error 1

我尝试生成动态库以避免排序库的问题,但没有成功。

请原谅我的英语,但我希望我的问题很清楚。

谢谢。

【问题讨论】:

标签: c++ static-linking dynamic-linking


【解决方案1】:

未定义的引用表示链接器无法找到库,请在 ./nusmv/NuSMV/build 中查找 libnusmvcore。请注意相对路径,可能会将其更改为绝对路径,以确保链接器正在寻找正确的位置。

【讨论】:

  • 我使用了绝对路径(我将所有需要的库放在 /user/local/lib 中),但也没有用。看来我的项目没有使用静态 libnusmv 库。
【解决方案2】:

LIBS 变量错误,应该是 LDFLAGS 其次,您正在到处传递 -static 标志,如果不是,您是否尝试构建静态库是没有意义的,我建议将其删除,因为这不是写入链接器的指令。此外,从 .cpp 编译 .o 时也不进行链接

还强烈建议在定义 SRC 和 OBJS 时使用 ':=' 而不是 '=',这样它们就被定义一次,并且每次提到它们时都不会重新评估。

【讨论】:

  • 我认为像你纠正我这样在 LDFLAGS 中包含 libnusmv.a 意味着我将 lnusmv 链接到 MyProject,我错过了什么吗?
  • 您只为链接器步骤提供链接器标志,$(EXEC): $(OBJS) @$(CXX) -o $@ $^ $(CXXFLAGS) $(LIBS),就像您拥有它一样。随心所欲地称呼它,但通常将此 LDFLAGS 称为匹配编译器步骤未链接的约定;所以链接器标志在那里没有意义,因为你正在编译二进制文件而不是库,所以--static 在我看来根本没有任何意义。你需要清楚你正在建造哪些东西,你拥有哪些东西
  • 我想用一个外部项目(名为 NuSMV)编译我的项目(名为 BMCTool)。后者生成我在 Makefile 中添加的静态库 (*.a) 以将其与我的项目链接。问题是当我编译时出现上面的错误,就像我的项目没有使用提到的 NuSMV 库一样。
  • 编译没有意义。你需要清楚和准确。您是否正在尝试构建需要与 NuSMV 生成的库链接的 BMCTool?你事后所说的一切都是坦率和荒谬的胡言乱语。一次一件事:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多