LNK2005, уже определенная ошибка компоновщика ошибок в MSVC2010

Я пытаюсь реализовать тестовый проект, используя библиотеку Point Cloud и OpenCV с несколькими файлами. Когда я пытаюсь скомпилировать, я получаю сообщение «уже определенная ошибка». Вероятно, я делаю что-то глупое, чего не могу понять по какой-то причине - я попробовал пару решений, найденных здесь, ни одно из них не помогло в моем случае.

Что я имею:

Файл libs.h, в который я загружаю файлы lib (в свойствах проекта я устанавливаю только пути .lib и загружаю библиотеки «вручную», например заголовки):

#pragma once

#ifndef PCLTEST_LIBS
#define PCLTEST_LIBS

#ifdef _DEBUG
  #pragma comment(lib, "pcl_apps-gd.lib")
  #pragma comment(lib, "pcl_common-gd.lib")
  // a bunch of other debug libs
#else
  // the release libs
#endif
#endif

Основной файл, из которого я в основном удалил все на данный момент для отладки:

// load the libs
#ifndef PCLTEST_LIBS
#include "libs.h"
#endif

// pcltest includes
// if only this first one is #included, everything is OK
#include "opencvOperations.h"
// #including this one causes the error
#include "files.h"
// these ones are not working also
//#include "cloudOperations.h"
//#include "visualize.h"

// c++ headers
#include <stdio.h>
#include <string>
//#include <sstream>
//#include <iostream>

void writeInfo()
{
    // some std::cout calls
}

int main( int argc, char* argv[] )
{
    writeInfo();
    // this function is in opencvOperations.h and works OK
    pcltest::openLena();
}

Затем я получаю несколько сообщений об ошибках в моем main.obj о том, что некоторые (связанные с PCL) символы уже определены в files.obj. Я использую вызовы, связанные с PCL, как в opencvOperations, так и в файлах, первый в порядке, второй не работает.

Изменить: чтобы добавить больше деталей, заголовок my files.h:

#pragma once

#ifndef PCLTEST_FILES
#define PCLTEST_FILES

// pcl headers
#ifndef PCL_COMMON_H_
#include <pcl/common/common_headers.h>
#endif
#ifndef PCL_IO_FILE_IO_H_
#include <pcl/io/file_io.h>
#endif
#ifndef PCL_IO_PCD_IO_H_ 
#include <pcl/io/pcd_io.h>
#endif
#ifndef PCL_IO_PLY_IO_H_ 
#include <pcl/io/ply_io.h>
#endif
// boost headers
#ifndef BOOST_FILESYSTEM_OPERATIONSX_HPP 
#include <boost/filesystem/operations.hpp>
#endif

#endif

namespace pcltest
{
    // function to open PCL or binary PLY files
    pcl::PointCloud<pcl::PointXYZ>::Ptr openCloud(std::string filename);

    // function to save the point cloud to PCD format
    void saveCloud();
}

До разбиения кода на отдельные файлы все работало хорошо (с теми же настройками проекта).

Изменить2:

Я нашел источник проблемы,

#include <pcl/io/ply_io.h>

вызывает это. На данный момент я избавился от всего, что связано с PLY, и все работает нормально. Я посмотрю на это позже, это может быть проблема с библиотекой PCL. Мне все еще странно, почему этот вызов вызывает ошибку компоновщика в другом файле, где я даже не использую функции/переменные, связанные с PLY.


person Oszkar    schedule 01.12.2011    source источник
comment
какая переменная, по его словам, уже определена и где эта переменная появляется?   -  person Joseph Stine    schedule 01.12.2011
comment
Для files.h в настоящее время перечислены 4 символа: enum pcl::io::ply::Format __cdecl pcl::io::ply::getEndianess(void) int __cdecl pcl::io::ply::getTypeFromTypeName(class std::basic_string‹char,struct std::char_traits‹char›,class std::allocator‹char› › const &) unsigned __int64 __cdecl pcl::io::ply::getMaximumCapacity(int) void __cdecl pcl::io ::ply::write(struct pcl::io::ply::camera const &,class std::basic_ostream‹char,struct std::char_traits‹char› › &,bool) (на самом деле я не вызываю никаких из этих)   -  person Oszkar    schedule 01.12.2011
comment
содержит ли files.h полное определение функции или только прототип?   -  person Joseph Stine    schedule 01.12.2011
comment
просто прототип, я скопировал его в оригинальные горшки   -  person Oszkar    schedule 01.12.2011
comment
Есть ли какое-то фактическое определение кода (в отличие от объявления) в этих заголовках pcl? В частности, где определены pcl::io::ply::getTypeFromTypeName и pcl::io::ply::write?   -  person Kevin Hopps    schedule 01.12.2011
comment
Я использую бинарный пакет pcl, поэтому они находятся в pcl-io.dll и pcl-io.lib (и pcl-io-gd.dll, pcl-io-gd.lib для отладки)   -  person Oszkar    schedule 01.12.2011
comment
Я нашел источник проблемы, #include ‹pcl/io/ply_io.h› вызывает это. На данный момент я избавился от всего, что связано с PLY, и все работает нормально. Я посмотрю на это позже, это может быть проблема, связанная с библиотекой PCL, в таком случае я напишу в список рассылки PCL.   -  person Oszkar    schedule 01.12.2011


Ответы (2)


У меня была та же проблема, что и у вас. У меня были файлы surface.h и surface.cpp, и я обнаружил, что мне нужно включить файл ply_io.h из surface.cpp, а не из surface.h, и теперь он компилируется нормально. Я надеюсь, что это помогает или имеет смысл! ха-ха

person Harry    schedule 13.01.2012
comment
стреляй, это работает! Благодарность! :) не видел вашего ответа раньше, но он может быть очень полезен позже - person Oszkar; 02.03.2012
comment
@ Гарри, возможно, это помогло, но почему? Если у Surface.h есть #pragma Once или #ifndef #define #endinf, это не должно быть проблемой. - person sprite; 24.07.2013

Если константа создается во включении, можно также использовать selectany, согласно http://msdn.microsoft.com/en-us/library/5tkz6s71%28v=vs.80%29.aspx -- в моем случае:

const int CSdata[] = {1, 2, 3, 4};

при включении в более чем одну исходную часть создает LNK2005 во время компоновки, чего можно избежать с помощью:

const __declspec(selectany) int CSdata[] = {1, 2, 3, 4};

Непортативный, да...

person Juanito de las Habichuelas    schedule 11.09.2012