2016-08-16 198 views
1

我在编译和链接miracl库时遇到了问题。编译和链接miracl C++

当我试图编译和链接MIRACL同时使用cmake我收到有关miracl.h文件中像奇怪的错误信息:

error: expected initializer before ‘mr_large’ 

的CMakeLists.txt:

cmake_minimum_required(VERSION 3.0) 
project(OS-PSI) 

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -maes -O3 -mavx") 

include_directories($ENV{HOME}/libscapi/lib/Miracl/include) 

find_library(
     LIBMIRACL 
     NAMES miracl 
     PATHS $ENV{HOME}/libscapi/install/lib/ 
     NO_DEFAULT_PATH 
) 


set(SOURCE_FILES main.cpp) 
add_executable(OS-PSI ${SOURCE_FILES}) 

target_link_libraries(OS-PSI ${LIBMIRACL}) 

main.cpp

#include <iostream> 
#include <miracl.h> 
#include <mirdef.h> 
#include <ecn.h> 
#include <big.h> 


int main(int argc, char *argv[]) 
{ 
    Big big1(12); 
    int partyId = atoi(argv[1]); 
    return 0; 
} 

我所要做的就是创建一个简单的程序,使用miracl库

+0

重做'target_link_libraries'调用。它不会帮助重复库;-)尝试使用find_library来查找miracl库的正确路径。注意:你不应该在'#include'指令中使用相对包含路径。通过'target_include_directories'指定include目录来解决这个问题。 –

回答

0

我发现这个问题后,我在这个link

的张贴在MIRACL GitHub上解决方法是将__int64更改为long longmirdef.h

+0

如果你确实在ubuntu/linux上安装了奇迹,你能帮我安装吗?我跟着文档,但无法编译程序。 – Lucky

1

您显示的错误是一个编译错误,它似乎来自其中一个Miracl标题。就让我们来看看在documentation显示这是一个C库不是C++,因此建议:

extern "C" 
{ 
    #include "miracl.h" 
} 

也要去上说

虽然在大多数情况下,最好使用说明的C++包装类在第7章。

所以我建议你看看C++接口的documentation。如果我正确理解他们的例子,看起来你不需要在C++中包含miracl.hmirdef.hecn.h

后,你固定的问题,用于链接库,像下面这样使用find_library()应该工作,更新路径是绝对的和更新/path/to/libscapi...您的实际路径:

find_library(
    LIBMIRACL 
    NAMES miracl 
    PATHS /path/to/libscapi/install/lib/ 
    NO_DEFAULT_PATH 
) 

然后,您可以将您的库使用:

target_link_libraries(OS-PSI ${LIBMIRACL}) 

你也可以治好你包括通过将Miracl/include目录include路径:

include_directories(/path/to/libscapi/lib/Miracl/include) 

,然后你可以使用下面的,它允许你的程序有不同的安装路径编译:

#include <iostream> 
#include <big.h> 
+0

更改并删除miracl.h mirdef.h和ecn.h后,我遇到了同样的问题。 – liorko

+0

@liorko在发布的代码和CMakeLists.txt中没有问题。也许你应该直接询问miracl tracker https://github.com/miracl/MIRACL/issues? –

+0

感谢您的咨询!我会问那里 – liorko