LNK2005, ошибка компоновщика «уже определенная ошибка» в MSVC2010 - PullRequest
2 голосов
/ 01 декабря 2011

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

Что у меня есть:

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

#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

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

// 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, так и в файлах, первый из них в порядке, второй не работает.

Редактировать: Чтобы добавить больше подробностей, мой заголовок 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();
}

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

Edit2:

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

#include <pcl/io/ply_io.h>

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

Ответы [ 2 ]

8 голосов
/ 14 января 2012

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

2 голосов
/ 11 сентября 2012

Если создается экземпляр константы во включении, можно также использовать 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};

Непереносимо, да ...

...