2017-07-29 163 views
0

我一直使用Xcode在C++中編譯基於OpenCV的代碼。 Xcode中的過程非常簡單,我只需提及路徑並將必要的lib文件添加到項目中即可。這個應用程序稱爲CodeRunner 2 macOS。 Theres沒有關於如何包含外部庫在此應用程序中編譯代碼的適當文檔。是否可以鏈接OpenCV頭文件並在CodeRunner中進行編譯?如果是的話,有人可以發佈步驟嗎?在CodeRunner 2應用程序中包含外部庫?

回答

2

您可以通過設置新語言在CodeRunner中運行OpenCV。轉到首選項 - >語言,右鍵單擊C++,然後選擇複製。命名新的語言「C++ OpenCV」。在首選項窗口的右側,單擊設置,然後單擊編輯腳本按鈕。尋找這一行(或類似的東西):

xcrun clang++ -x c++ -lc++ -o "$out" "${files[@]}" "${@:1}" 

爲OpenCV的添加鐺++命令行參數"$out"後。這裏是我的版本:

xcrun clang++ -x c++ -lc++ -o "$out" -I/usr/local/opt/opencv3/include -L/usr/local/opt/opencv3/lib -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_imgcodecs -lopencv_videoio -lopencv_calib3d "${files[@]}" "${@:1}" 

修改-I和 - L參數以匹配您的OpenCV的安裝路徑。在這臺機器上,我使用Homebrew安裝OpenCV,以便它安裝在/ usr/local/opt中。在我從源代碼編譯的其他機器上,OpenCV安裝在/ usr/local/lib中。

修改-l參數以包含您通常使用的庫。

保存編譯腳本後,返回到首選項 - >語言並選擇模板按鈕。您可以爲OpenCV程序設置一個模板。這裏是我的:

#include <iostream> 

#include "opencv2/core.hpp" 
#include "opencv2/imgproc.hpp" 
#include "opencv2/highgui.hpp" 

using namespace std; 

int main(int argc, char *argv[]) { 
    cv::Mat image; 
    // read an image 
    if (argc < 2) 
     image = cv::imread("img.jpg"); 
    else 
     image = cv::imread(argv[1]); 

    if (!image.data) { 
     std::cout << "Image file not found\n"; 
     return 1; 
    } 

    // create image window named "asdfasdf" 
    cv::namedWindow("asdfasdf"); 
    // show the image on window 
    cv::imshow("asdfasdf", image); 
    // wait for key 
    cv::waitKey(0); 

    return 0; 
} 
+0

有反正在代碼流道來使用gcc? –

+0

我不知道Xcode是否仍然支持gcc,但如果是這樣,你應該可以在編譯腳本中用'g ++'替換'clang ++'。 – SSteve

1

通過SSteve前面的回覆是偉大的,也幫助我理清聯在CodeRunner 升壓庫。

因爲在前面的回覆解決方案是專門針對OpenCV的庫,一不小心增加了鐺++對於一般的外部庫可能只是產生一個浩大的工程錯誤的命令行,這是事實,當我試圖鏈接加速庫。

在這裏,我想澄清SSteve的回覆中的不清楚的一點,以便在Mac OS系統中編譯外部庫之前,每個人都知道如何以及如何修改命令行。

我會用我的案例來解釋,但是在某些時候,我會通知您CodeRunner設置或一般命令行輸入中的棘手位。

我用macport通過

sudo port install boost 
  • 頭文件位於/opt/local/include
  • 庫安裝升壓庫位於/opt/local/lib/

如果你不能找到具體的子庫Boost,打開你的終端輸入

cd /opt/local/lib/ 
find . -iname "*boost*" 

,你應該看到升壓的所有子庫(靜態庫.a結束和動態庫.dylib結束),如下。

enter image description here

在您開始修改原來的命令行(支持C++ 14版),如

xcrun clang++ -x c++ -std=c++14 -stdlib=libc++ -lc++ -o "$out" "${files[@]}" "${@:1}" ${CR_DEBUGGING:+-g} 

你需要知道的頭文件的目錄是-I後的目錄Boost庫後-L,如

-I /opt/local/include/ 
-L /opt/local/lib/ 

爲了在Boost(參見上圖)中使用已編譯的靜態或動態子庫,必須在-L /opt/local/lib/之後專門包含它。但是,僅僅複製不帶文件擴展名的庫名稱.a.dylib絕不會讓CodeRunner找到您期望運行的庫!

的詳細說明here我只是配額下面

clang -dynamiclib -o libtest.dylib file1.o file2.o -L/some/library/path -lname_of_library_without_lib_prefix 

的重要位要在Boost Quickstart Document

#include <boost/regex.hpp> 
#include <iostream> 
#include <string> 

int main() 
{ 
    std::string line; 
    boost::regex pat("^Subject: (Re: |Aw:)*(.*)"); 

    while (std::cin) 
    { 
     std::getline(std::cin, line); 
     boost::smatch matches; 
     if (boost::regex_match(line, matches, pat)) 
      std::cout << matches[2] << std::endl; 
    } 
} 

運行這樣的示例中代碼的方式來包括<boost/regex.hpp>現在是

xcrun clang++ -x c++ -std=c++14 -stdlib=libc++ -lc++ -o "$out" -I /opt/local/include/ -L /opt/local/lib -lboost_regex-mt "${files[@]}" "${@:1}" ${CR_DEBUGGING:+-g} 

通過使用此命令行,您應該可以使用Boost庫編譯示例代碼。

只記得用-l替換前綴-lib,並排除命令行中的文件擴展名。

最後,有一些可供選擇的解決方案包括:通過使用Xcode的外部庫,這是在here

相關問題