2016-06-29 48 views
0

我試圖RabbitMQ + C++。在Linux上工作Ubuntu的16.04。有工作代碼,當我編譯使用CLion所有工作正常。 我有和平的代碼,我需要用root運行,所以我想用g++來運行它。使用g ++在終端中運行.cpp文件時發生錯誤

ERROR從終端

In function `main': 
receiveUNPW.cpp:(.text+0x8e8): undefined reference to `SimplePocoHandler::SimplePocoHandler(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned short)' 
receiveUNPW.cpp:(.text+0xc9c): undefined reference to `SimplePocoHandler::loop()' 
receiveUNPW.cpp:(.text+0xcce): undefined reference to `SimplePocoHandler::~SimplePocoHandler()' 
receiveUNPW.cpp:(.text+0xea7): undefined reference to `SimplePocoHandler::~SimplePocoHandler()' 
/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/libamqpcpp.so: undefined reference to `pthread_create' 

我寫:

g++ -std=c++11 receiveUNPW.cpp -o receiveUNPW -lcrypt -lPocoNet -lPocoFoundation -lamqpcpp 

CMakeList.txt

cmake_minimum_required(VERSION 3.5) 
project(test) 

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

add_library(poco_simple_handler SimplePocoHandler.cpp SimplePocoHandler.h) 
target_link_libraries(poco_simple_handler PocoNet PocoFoundation crypt) 

set(PROGS 
     sendUNPW 
     receiveUNPW 
     ) 

foreach(item ${PROGS}) 
    add_executable(${item} "${item}.cpp") 
    target_link_libraries(${item} amqpcpp poco_simple_handler PocoNet PocoFoundation crypt) 
endforeach(item) 

我的想法

如我在使用g++時可以看到的,它無法找到對SimplePocoHandler的引用。在CmakeList.txt我有

add_library(poco_simple_handler SimplePocoHandler.cpp SimplePocoHandler.h) 
target_link_libraries(poco_simple_handler PocoNet PocoFoundation crypt) 

所以當我在CLION編譯一切正常。所以我似乎需要在使用g++時也這樣做。但我不知道該怎麼做,任何建議或解釋都會很棒。

我不同意我的receiveUNPW.cpp代碼,但它幾乎類似於receiver.cpp你可以看到there,也是我沒有任何錯誤,在CLion一切工作正常,我只需要使用運行我的程序具有root權限的終端。

+0

「我的代碼和平什麼,我需要以root運行,所以我需要用克至運行它++」 - 爲什麼你需要編譯的代碼以root身份運行它作爲根? –

+0

@JesperJuhl你是指以root身份運行?我不想設置權限項目文件夾等。我只是想運行代碼使用g ++,測試它,然後可能使腳本或東西自動運行它。 – Trimidas

+0

一個不會用g ++「運行」代碼。 g ++是一個編譯器(可能與CLion使用的編譯器相同)。編譯器編譯代碼並生成可執行文件(程序),然後運行(執行)。編譯器不運行該程序。 –

回答

1

要以root用戶身份運行代碼,請使用su -切換到root shell,然後執行CLion生成的二進制文件。或者使用sudo運行它。你也可以在可執行文件上設置suid位,並使其由root擁有,然後它將始終以root身份運行,但這不是建議的 - 可能存在太多安全問題。

您不需要以root身份重新編譯應用程序以root身份運行它。

編輯與例如作爲請求:

一個簡單的程序:

#include <iostream> 
int main() { 
    std::cout << "Hello world\n"; 
} 

編譯它:

$ g++ hello.cc

運行它:

$ ./a.out 
Hello world 
$ 

運行它作爲根:

$ su - 
# /path/to/program/a.out 
Hello world 
# 
+0

你能寫一個例子嗎?我真的不明白你的意思 – Trimidas

相關問題