C++ 链接库C++;

C++ 链接库C++;,c++,static-linking,dynamic-linking,C++,Static Linking,Dynamic Linking,我正在努力将一个项目链接到一个外部项目(名为Prog)。 我不习惯处理大项目和依赖性问题,这是我第一次在链接另一个库时遇到这样的问题 我想将此库作为静态库或更好的库,作为MyProject的动态库。 Prog的编译为我提供了静态库(“.a”),我将它们包含在我的“基本”Makefile中,下面是它的图片: Makefile : CXX = g++ SRCS = $(shell find . -name "*.cpp") OBJS = $(addsuffix .o, $(basename $(S

我正在努力将一个项目链接到一个外部项目(名为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)
当我运行时,编译器会识别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
MC/PROG.o:在函数«PROG::createModel(std:uu cx11::basic_string)»中:
/home/git/test/test src/MC/PROG.cpp:37:对«PROGCore_init_data()
/home/git/test/test src/MC/PROG.cpp:41:对«PROGCore_init(PROGEnv_TAG*,void(*(*)[2])(PROGEnv_TAG*),int)的不精确引用»
collect2:错误:ld返回了1个退出状态
Makefile:46:目标“测试”的配方失败
make:**[测试]错误1
我试图生成动态库以避免排序库的问题,但没有成功

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


谢谢。

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

LIBS变量错误,应为LDFLAGS 第二,你到处传递-static标志,这没有任何意义。如果你不尝试构建一个静态库,我建议删除它,因为这不是一条写入链接器的指令。此外,在从.cpp编译.o时,也不会进行链接


还强烈建议在定义SRC和obj时使用“:=”而不是“=”,这样它们只定义一次,而不会在每次提到它们时重新计算。

可能重复:我使用了绝对路径(我将所有需要的库放在/user/local/lib中),但也不起作用。看起来我的项目没有使用静态libnusmv库。我认为在LDFLAGS中包括libnusmv.a,就像你纠正我的,这意味着我将lnusmv链接到了我的项目,我错过了什么吗?你只向链接器步骤提供链接器标志,
$(EXEC):$(OBJS)@$(CXX)-o$@$^$(cxflags)$(LIBS)
,正如你所做的那样。您可以随意调用它,但通常会调用此LDFLAGS以匹配编译器步骤未链接的约定;因此,链接器标志在这里没有任何意义,因为您正在编译二进制文件而不是库,所以
--static
在我看来根本没有任何意义。你需要弄清楚你正在构建哪些东西,你有哪些。我想用一个外部项目(名为NuSMV)编译我的项目(名为BMCTool)。后者生成静态库(*.a),我将其添加到Makefile中以将其与项目链接。问题是当我编译上面的错误出现时,它就像我的项目没有使用上面提到的NuSMV库一样。编译没有任何意义。你需要清楚和准确。您是否正在尝试构建需要与库链接的BMCTool?你事后所说的一切都是胡言乱语,毫无意义。一次只做一件事:-)
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