我一直使用Xcode在C++中編譯基於OpenCV的代碼。 Xcode中的過程非常簡單,我只需提及路徑並將必要的lib文件添加到項目中即可。這個應用程序稱爲CodeRunner 2 macOS。 Theres沒有關於如何包含外部庫在此應用程序中編譯代碼的適當文檔。是否可以鏈接OpenCV頭文件並在CodeRunner中進行編譯?如果是的話,有人可以發佈步驟嗎?在CodeRunner 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;
}
通過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
結束),如下。
在您開始修改原來的命令行(支持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
- 1. 在QT4應用程序中包含靜態外部庫
- 2. 如何在ASP.NET Webforms中包含外部Angular 2應用程序頁面
- 3. 在Angular(4)應用程序組件中包含外部css
- 4. 在XBAP應用程序中包含外部文件
- 5. 錯誤:在包含外部庫後程序中出現'\ 224'
- 6. 在webpack中包含外部庫
- 7. 在Yii中包含外部庫
- 8. 在C中包含外部庫C
- 9. 如何在CMakeLists中包含外部庫?
- 10. 如何包含外部庫?
- 11. 在編譯C++程序時包含外部庫的問題
- 12. 部署Angular 2應用程序(不包含angular-cli)
- 13. 如何爲webstart應用程序包含外部配置
- 14. 如何在編寫CodeRunner文檔時包含非框架庫?
- 15. 發佈開源iOS應用程序+靜態庫時包含外部項目?
- 16. 在使用create-react-app配置的新反應應用程序中包含外部JavaScript庫
- 17. 在Angular 2 Webpack應用程序中不能包含PrimeNG
- 18. 在flex應用程序中包含外部動作文件的最佳做法
- 19. 包括外部sqlite3數據庫到iPhone應用程序
- 20. 在Django 1.9中包含應用程序
- 21. 在php應用程序中包含Mediawiki
- 22. 在應用程序中包含IIS
- 23. 外部加載的移動應用程序是否可以包含在另一個移動應用程序中?
- 24. Ionic 2:在應用程序內部加載外部內容
- 25. 外部庫應該包裝?
- 26. 如何使用Browserify在AngularJS應用程序中包含實用程序庫?
- 27. 在vue.js中使用外部js庫應用程序
- 28. 在angular2 + webpack應用程序中使用外部庫
- 29. 在angular 4應用程序中使用外部的javaScript庫
- 30. 生成包含外部程序包的主包
有反正在代碼流道來使用gcc? –
我不知道Xcode是否仍然支持gcc,但如果是這樣,你應該可以在編譯腳本中用'g ++'替換'clang ++'。 – SSteve