我有一个使用几个库的C / C++程序x64。
我使用的编译器:用于x64的Microsoft(R)C / C++优化编译器版本18.00.31101
刚开始时,我确实对静态/动态链接存在一些问题,但是我已经解决了这些问题,并且可以成功地使用MD和MDd标志编译程序。现在,我想摆脱C运行时库DLL。我想使用MT标志来编译我的应用程序。
我使用的库:samtools和zlib(在生成两个库时都使用MT标志)。最后,即使在所有编译过程中都使用了相同的配置,在链接过程中我仍然遇到这样的错误。错误信息:
LIBCMT.lib(atox.obj) : error LNK2005: atoll already defined in libbam.lib(bam_import.obj)
myApplication.exe : fatal error LNK1169: one or more multiply defined symbols found
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\BIN\x8
6_amd64\link.exe"' : return code '0x491'
生成库和链接的命令:
CC=cl.exe
AR= lib.exe
CFLAGS= /MT -c
INCLUDES= -I. -Iwin32
1st library:
ZLIB: $(OBJS)
$(AR) objectfiles
OBJS:
$(CC) $(CFLAGS) $(INCLUDES) sourcefiles
2nd library:
libbam.lib:$(LOBJS)
$(AR) $(LOBJS) $(BCFOBJS) /out:libbam.lib
BCFOBJ:
$(CC) $(CFLAGS) $(INCLUDES) sourcefiles
.c.obj: // LOBJS are generated here
$(CC) -c $(CFLAGS) $(INCLUDES) $< -o $@
我使用上面生成的库来编译程序的命令:
CC=cl.exe
LINK=link.exe
FLAGS= -Ox /MT -c
obj1.obj:
$(CC) $(FLAGS) test.cpp $(INCLUDES)
testMain.obj:
$(CC) $(FLAGS) testMain.cpp $(INCLUDES)
testMain.exe: $(OBJ)
$(LINK) obj1.obj testMain.obj $(LIBS) /OUT:testMain.exe
由于makefile相当长,因此我尝试对其进行一些简化,显示用于生成的每个库的标志。
提前致谢。
最佳答案
我已经解决了问题。显然,在我具有所需库的源文件之一中有一个称为atoll()的函数,并且在静态链接时,编译器正在尝试链接系统atoll()函数;但是,那里已经有一个。我在所有源文件中重命名了该函数,但不能静态编译我的应用程序。
关于c++ - C/C++静态链接错误(LIBCMT.lib),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29826330/