C / C ++静态链接错误(LIBCMT.lib)

时间:2015-04-23 14:22:57

标签: c++ visual-studio linker linker-errors windows-7-x64

我有一个C / C ++程序x64,它使用了几个库。

我使用的编译器: Microsoft(R)C / C ++优化编译器版本18.00.31101 for x64

一开始我确实遇到了静态/动态链接的一些问题,但是我已经解决了这些问题,并且我可以使用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非常长,我试着简化一下,显示我为每个生成的库使用的标志。

提前致谢。

1 个答案:

答案 0 :(得分:0)

我已经解决了这个问题。显然,在我为所需库创建的源文件之一中有一个名为atoll()的函数,并且在静态链接时,编译器试图链接系统atoll()函数;但是,其中有一个已经存在。我在所有源文件中重命名了该函数,而不是我可以静态编译我的应用程序。