架构x86_64上的未定义符号 [英] Undefined symbols on architecture x86_64

查看:99
本文介绍了架构x86_64上的未定义符号的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在将我在Python中实现的东西移植到c ++以获得速度。我是cmake / clang构建系统的新手,但我已经写了我需要的大部分内容。我陷入了一个似乎无法解决的错误;来自库的示例实现(在其测试套件中运行良好)的确切代码块会引发错误,该错误通过libc ++和libstdc ++以及所有可用的构建系统持续存在。 WTF ??



这是错误:



I'm porting something I implemented in Python to c++ for speed. I'm brand new to the cmake/clang build system but I've written up most of what I need. I'm stuck on an error that seems unsolvable; the exact code block from a library's example implementation (that runs fine in their testing suite) throws an error that persists through libc++ and libstdc++ and all available build systems. WTF??

Here's the error:

1 warning generated.
Linking CXX executable BloomBloomier
Undefined symbols for architecture x86_64:
  "bloomier::BloomierFilter::BloomierFilter(int, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, int, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, int> > >*, int, int, int)", referenced from:
      bloomBloomier::instantiate(int, float) in main.cpp.o
  "bloomier::BloomierFilter::~BloomierFilter()", referenced from:
      bloomBloomier::instantiate(int, float) in main.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[3]: *** [BloomBloomier] Error 1
make[2]: *** [CMakeFiles/BloomBloomier.dir/all] Error 2
make[1]: *** [CMakeFiles/BloomBloomier.dir/rule] Error 2
make: *** [BloomBloomier] Error 2







这是main.cpp的片段






Here's a snippet of main.cpp

#include <fstream>
#include <iostream>
#include "libs/bloomFilter/bloom_filter.hpp"
#include "libs/bloomierFilter/BloomierFilter.h"
#include <math.h>
using namespace std;

class bloomBloomier
{

public:

    void instantiate(int n, float p){

        //...


        //THIS REGION IS CAUSING THE ERROR, IT RUNS FINE IN bloomierFilterTest
        int hash = 0; int m = 10; int k = 5; int q = 24;
        map<string, int> mp; mp["abc"] = 10; mp["def"] = 20; mp["abd"] = 30;
        vector<string> keys = {"abc", "def", "abd"};
        auto bf = bloomier::BloomierFilter(hash, &mp, m, k, q);


        //...


    }





这是BloomierFilter.h:





Here is BloomierFilter.h:

#ifndef __BloomierFilter_H_
#define __BloomierFilter_H_

#include <map>
#include <vector>
#include <iostream>
#include <cstddef>
#include <cstring>
#include "core/util.h"
#include "core/utilEncode.h"
#include "core/bloomierHasher.h"
#include "core/orderAndMatchFinder.h"

namespace bloomier {

class BloomierFilter {
    int hashSeed;
    std::map<std::string, int>* keyMap;
    OrderAndMatchFinder* oam = NULL;
    OrderAndMatch* om = NULL;
    BloomierHasher* h = NULL;

    int m;
    int k;
    int q;
    int byteSize;

    unsigned char *table = NULL;
    // not size optimal, only for testing purposes
    int *valueTable = NULL;
public:
    BloomierFilter(int hashSeed, std::map<std::string, int>* keyMap, int m, int k, int q);
    ~BloomierFilter();
    void create(std::map<std::string, int>* keyMap, OrderAndMatchFinder* oam);
    bool get(std::string key, int& value);
    bool set(std::string key, int value);
};

}
#endif //__BloomierFilter_H_





这是CMakeLists.txt文件(注意:这可能是我遇到问题的地方,我对cmake / make来说是全新的):





Here is the CMakeLists.txt file (Note: This is probably where I'm having an issue, im brand new to cmake/make):

cmake_minimum_required(VERSION 3.1)
project(BloomBloomier)

# cmake -DCMAKE_BUILD_TYPE:STRING=Debug ../src
# http://www.cmake.org/Wiki/CMake_Useful_Variables#Compilers_and_Tools
set(CMAKE_CXX_FLAGS_DEBUG, ON)
set(CMAKE_CXX_COMPILER "/usr/bin/c++")
#set(CMAKE_CXX_COMPILER "/usr/bin/llvm-g++")
# http://stackoverflow.com/questions/5334095/cmake-multiarchitecture-compilation
set(CMAKE_CXX_FLAGS "-std=c++11 -m64")
# cmake -DCMAKE_OSX_ARCHITECTURES=x86_64

include_directories(/usr/local/include)
include_directories(.)
include_directories(./core)
link_directories(/usr/local/lib)
link_directories(./libs/bloomierFilter)

set(bloomier_srcs
    # bloomier filter code
    libs/bloomierFilter/BloomierFilter.cpp
    libs/bloomierFilter/core/util.cpp
    libs/bloomierFilter/core/utilEncode.cpp
    libs/bloomierFilter/core/hash.cpp
    libs/bloomierFilter/core/bloomierHasher.cpp
    libs/bloomierFilter/core/singletonFindingTweaker.cpp
    libs/bloomierFilter/core/orderAndMatchFinder.cpp
    )

add_library(bl ${bloomier_srcs})



set(SOURCE_FILES main.cpp)


add_executable(BloomBloomier ${SOURCE_FILES})





这是代码片段正常运行的文件in:





Here is the file that the snippet of code runs fine in:

#include <limits.h>
#include <time.h>
#include <gtest/gtest.h>
#include <list>
#include <map>
#include <string>
#include "BloomierFilter.h"
#include "util.h"

using namespace std;

class QuickTest : public testing::Test {
//...
};

class BloomierFilterTest : public QuickTest {
//...
};

TEST_F(BloomierFilterTest, simpleGetTest) {


    //THIS SNIPPET RUNS FINE WHEN BUILDING THIS PROJECT
    int hash = 0; int m = 10; int k = 5; int q = 24;
    map<string, int> mp; mp["abc"] = 10; mp["def"] = 20; mp["abd"] = 30;
    vector<string> keys = {"abc", "def", "abd"};
    auto bf = bloomier::BloomierFilter(hash, &mp, m, k, q);

    //...
}

TEST_F(BloomierFilterTest, simpleSetTest) {
    //...
}



最后这是最后一个片段所在项目的cmakelists.txt:




And finally here is the cmakelists.txt for the project that this last snippet is in:

cmake_minimum_required(VERSION 2.8)
project( bloomier )

# cmake -DCMAKE_BUILD_TYPE:STRING=Debug ../src
# http://www.cmake.org/Wiki/CMake_Useful_Variables#Compilers_and_Tools
set(CMAKE_CXX_FLAGS_DEBUG, ON)
set(CMAKE_CXX_COMPILER "/usr/bin/c++")
#set(CMAKE_CXX_COMPILER "/usr/bin/llvm-g++")
# http://stackoverflow.com/questions/5334095/cmake-multiarchitecture-compilation
set(CMAKE_CXX_FLAGS "-std=c++11 -m64")
# cmake -DCMAKE_OSX_ARCHITECTURES=x86_64

include_directories(/usr/local/include)
include_directories(.)
include_directories(./core)
link_directories(/usr/local/lib)

set(bloomier_srcs
    main.cpp

    # bloomier filter code
    BloomierFilter.cpp
    core/util.cpp
    core/utilEncode.cpp
    core/hash.cpp
    core/bloomierHasher.cpp
    core/singletonFindingTweaker.cpp
    core/orderAndMatchFinder.cpp

    # test code
    test/testutil.cc
    test/testUtilEncode.cc
    test/testHash.cc
    test/testBloomierHasher.cc
    test/testSingletonFindingTweaker.cc
    test/testOrderAndMatchFinder.cc
    test/testBloomierFilter.cc
    )

add_executable(bl ${bloomier_srcs})
target_link_libraries(bl gtest.a)





我已经在这方面工作了好几天了我真的很感激一些帮助。



I've been working on this for days and I would REALLY appreciate some help.

推荐答案

{bloomier_srcs})



set(SOURCE_FILES main.cpp)


add_executable(BloomBloomier
{bloomier_srcs}) set(SOURCE_FILES main.cpp) add_executable(BloomBloomier

{SOURCE_FILES})
{SOURCE_FILES})





这是代码片段运行正常的文件:





Here is the file that the snippet of code runs fine in:

#include <limits.h>
#include <time.h>
#include <gtest/gtest.h>
#include <list>
#include <map>
#include <string>
#include "BloomierFilter.h"
#include "util.h"

using namespace std;

class QuickTest : public testing::Test {
//...
};

class BloomierFilterTest : public QuickTest {
//...
};

TEST_F(BloomierFilterTest, simpleGetTest) {


    //THIS SNIPPET RUNS FINE WHEN BUILDING THIS PROJECT
    int hash = 0; int m = 10; int k = 5; int q = 24;
    map<string, int> mp; mp["abc"] = 10; mp["def"] = 20; mp["abd"] = 30;
    vector<string> keys = {"abc", "def", "abd"};
    auto bf = bloomier::BloomierFilter(hash, &mp, m, k, q);

    //...
}

TEST_F(BloomierFilterTest, simpleSetTest) {
    //...
}



最后这是最后一个片段所在项目的cmakelists.txt:




And finally here is the cmakelists.txt for the project that this last snippet is in:

cmake_minimum_required(VERSION 2.8)
project( bloomier )

# cmake -DCMAKE_BUILD_TYPE:STRING=Debug ../src
# http://www.cmake.org/Wiki/CMake_Useful_Variables#Compilers_and_Tools
set(CMAKE_CXX_FLAGS_DEBUG, ON)
set(CMAKE_CXX_COMPILER "/usr/bin/c++")
#set(CMAKE_CXX_COMPILER "/usr/bin/llvm-g++")
# http://stackoverflow.com/questions/5334095/cmake-multiarchitecture-compilation
set(CMAKE_CXX_FLAGS "-std=c++11 -m64")
# cmake -DCMAKE_OSX_ARCHITECTURES=x86_64

include_directories(/usr/local/include)
include_directories(.)
include_directories(./core)
link_directories(/usr/local/lib)

set(bloomier_srcs
    main.cpp

    # bloomier filter code
    BloomierFilter.cpp
    core/util.cpp
    core/utilEncode.cpp
    core/hash.cpp
    core/bloomierHasher.cpp
    core/singletonFindingTweaker.cpp
    core/orderAndMatchFinder.cpp

    # test code
    test/testutil.cc
    test/testUtilEncode.cc
    test/testHash.cc
    test/testBloomierHasher.cc
    test/testSingletonFindingTweaker.cc
    test/testOrderAndMatchFinder.cc
    test/testBloomierFilter.cc
    )

add_executable(bl


{bloomier_srcs})
target_link_libraries(bl gtest.a)
{bloomier_srcs}) target_link_libraries(bl gtest.a)





I几天来我一直在努力,我真的很感激一些帮助。



I've been working on this for days and I would REALLY appreciate some help.


这篇关于架构x86_64上的未定义符号的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆