2015-04-23 4 views
0

У меня есть программа на C/C++ x64, которая использует несколько библиотек.Ошибка статической связи C/C++ (LIBCMT.lib)

Компилятор Я использую: Microsoft (R) C/C++ оптимизирующий компилятор Версия 18.00.31101 для x64

В начале у меня были некоторые проблемы со статическим/динамическое связывание, но я решил эти вопросы , и я могу успешно скомпилировать мою программу с флагами MD и MDd. Теперь я хочу избавиться от библиотек библиотеки времени выполнения C. Я хотел бы скомпилировать мое приложение с использованием флагов 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 [email protected] 

Command я использую, чтобы скомпилировать свою программу с использованием библиотек мною выше:

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ах довольно долго, я попытался немного упростить его, показать флаги, которые я использую для каждой создаваемой библиотеки.

Заранее спасибо.

+0

Покажите нам строку commad – Kartoch

+0

Привет @ Kartoch, я попытался добавить пару строк. Приветствия. – serhatg

ответ

0

Я решил проблему. По-видимому, в одном из исходных файлов, которые у меня были для требуемой библиотеки, была функция atoll(), и при связывании статически компилятор пытался связать функцию atoll() системы; однако там уже был один из них. Я переименовал эту функцию во все исходные файлы, и я не могу статически компилировать свое приложение.

Смежные вопросы