Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 5

0
votes
answers
40 views
+10

NLoptr無法在Mac上安裝:無法加載共享對象

0

我試圖在Mac OS高級Sierra上安裝軟件包nloptr以便使用許多漂亮軟件包,如lme4,並且我在Anaconda中使用RStudio,並使用R 3.4.2。我還安裝NLopt(從NLopt網站上下載,而不是開發的版本。我還安裝了Xcode中的命令行工具,但我仍然無法安裝nloptr,並獲得該NLoptr無法在Mac上安裝:無法加載共享對象

Error: package or namespace load failed for ‘nloptr’ in dyn.load(file, DLLpath = DLLpath, ...): 
unable to load shared object '/Users/lambda/anaconda3/lib/R/library/nloptr/libs/nloptr.so': 
dlopen(/Users/lambda/anaconda3/lib/R/library/nloptr/libs/nloptr.so, 6): Symbol not found: _nlopt_add_equality_mconstraint 
Referenced from: /Users/lambda/anaconda3/lib/R/library/nloptr/libs/nloptr.so 
Expected in: flat namespace 
in /Users/lambda/anaconda3/lib/R/library/nloptr/libs/nloptr.so 

我已經在網上搜索怎麼辦,並且在/etc/ldpaths文件中添加了安裝NLopt的路徑到LD_LIBRARY_PATH,但是我仍然得到相同的錯誤。是的,我有和Trouble installing nloptr package on R 3.3.0一樣的問題,但是我沒有找到在那裏工作的解決方案因爲問這個問題的人自己解決了這個問題,我不知道他的意思是什麼時候他說「安裝爲root」。任何人都可以幫忙嗎?

另外,我有類似這樣的東西n使用CMake安裝NLopt,並且發生許多不同的功能:

In file included from f77api.c:103: 
./f77funcs.h:57:14: warning: 'nlopt_minimize_constrained' is deprecated 
    [-Wdeprecated-declarations] 
*info = nlopt_minimize_constrained((nlopt_algorithm) *algorithm, 
     ^
./nlopt.h:348:35: note: 'nlopt_minimize_constrained' has been explicitly marked 
    deprecated here 
int maxeval, double maxtime) NLOPT_DEPRECATED; 
          ^
./nlopt.h:320:43: note: expanded from macro 'NLOPT_DEPRECATED' 
# define NLOPT_DEPRECATED __attribute__((deprecated)) 
            ^

這是爲什麼圖書館沒有加載?

順便說一句,我已經安裝了Rcpp並更新它。 Rcpp在我的電腦上運行。

更新:我將默認的C和C++編譯器更改爲從R項目下載的clang4。我再次嘗試安裝,並得到了不同的錯誤:

Error: package or namespace load failed for ‘nloptr’ in dyn.load(file, DLLpath = DLLpath, ...): 
unable to load shared object '/Users/lambda/anaconda3/lib/R/library/nloptr/libs/nloptr.so': 
dlopen(/Users/lambda/anaconda3/lib/R/library/nloptr/libs/nloptr.so, 6): Library not loaded: @rpath/libnlopt.0.dylib 
Referenced from: /Users/lambda/anaconda3/lib/R/library/nloptr/libs/nloptr.so 
Reason: image not found 
Error: loading failed 

我試圖告訴R其中圖書館是Sys.geteng(DYLD_LIBRARY_PATH = "/usr/local/lib"),但沒有奏效。實際上,根據我從安裝得到的消息,R確實知道共享庫的位置,但它無法加載它。請幫忙!

沙发
0
0

沒關係,我重新安裝了Anaconda,並安裝了獨立的R和RStudio(不在Anaconda內),並且這些軟件包都已成功安裝。在Anaconda內部使用RStudio也許是個不錯的主意。

編輯:對於那些遇到類似情況的人:我轉向Microsoft R Open(MRO),因爲我最近在處理很多線性代數。然後,當我嘗試在MRO中安裝nloptr時,出現類似的錯誤消息,即共享庫無法加載,因爲找不到圖像。我重新安裝了CRAN R 3.4.3,並在那裏安裝了nloptr。因此,我發現在CRAN R 3.4.3中安裝了nloptr的.libPaths(),將nloptr文件夾複製到MRO存儲軟件包的位置,並使用實用程序RSwitch將R的默認版本更改爲MRO。然後,我在MRO中加載了nloptr,安裝了依賴它的軟件包,並使用了這些軟件包;他們工作得很好。我不知道導致錯誤的MRO有什麼問題,但至少這是有效的。

0
votes
answers
46 views
+10

CMake多選項設置

1

我正在使用CMake構建的項目,所以我正在爲它編寫一個CMakeLists.txt。在這個文件中,我想要一個(緩存的)CMake變量,它只能使用幾個選項中的一個(我將以某種方式指定),而不是任何任意字符串。爲了簡單起見,我們假設它是一個可以採用「紅色」,「綠色」或「藍色」的字符串 - 但沒有別的。CMake多選項設置

我可以用最近的CMake版本來實現這一點,除了設置一個任意的字符串,然後檢查它的有效性嗎?

+0

您能否介紹一下您正在嘗試做的事情?你是否提供了一個CMake啓用的項目,並想限制'option()'的值可能在'cmake-gui'中選擇?你正在編寫一個CMake幫助程序/包裝函數,並且你想限制傳遞參數的值嗎?你是否試圖阻止對某個變量的'set()'調用來獲得任何其他的預定義的值? – Florian

+0

@弗洛裏安:見編輯。而且,是的,當我運行ccmake(或cmake-gui)時,我希望列表出現在列表中。 – einpoklum

沙发
0
2

答案是在一個名爲"Constraining Values with ComboBoxes in CMake (cmake-gui)" Kitware的博客文章的一個被發現:

因此,這裏的工作原理是:爲要??限制在一定值的集合,其定義爲通常每個高速緩存條目具有默認值作爲STRING緩存變量,例如:現在

set(BaseName 「binary」 CACHE STRING 「BaseName chosen by the user at CMake configure time」) 

,限定了與它的初始默認值的緩存條目之後,定義該組串到其值應被約束:

set_property(CACHE BaseName PROPERTY STRINGS binary octal decimal hexadecimal) 

的set_property電話後,cmake的桂知道要呈現下拉組合框中編輯了「名前綴」緩存條目,它知道這個記錄的四個有效的選擇,它應該呈現爲binaryoctal,decimalhexadecimal

0
votes
answers
52 views
+10

cmake錯誤:沒有這樣的文件?

0

首先我使用克利翁和內置的cmake在Ubuntu 17cmake錯誤:沒有這樣的文件?

構建按摩日誌:

[ 20%] Linking C executable pacman 
cc: error: SDL2_image: No such file or directory 
CMakeFiles/pacman.dir/build.make:172: recipe for target 'pacman' failed 
make[3]: *** [pacman] Error 1 
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/pacman.dir/all' failed 
make[2]: *** [CMakeFiles/pacman.dir/all] Error 2 
CMakeFiles/Makefile2:79: recipe for target 'CMakeFiles/pacman.dir/rule' failed 
make[1]: *** [CMakeFiles/pacman.dir/rule] Error 2 
Makefile:118: recipe for target 'pacman' failed 
make: *** [pacman] Error 2 

cmakeList.txt:

cmake_minimum_required(VERSION 3.9) 
project(pacman C) 
set(CMAKE_C_STANDARD 99) 
set(SOURCE src/main.c src/input.c src/input.h src/view.c src/view.h src/models.h src/models.c) 
add_executable(pacman "${SOURCE}") 
include_directories(src) 
include_directories(src/SDL2-2.0.7/include) 
INCLUDE(FindPkgConfig) 
PKG_SEARCH_MODULE(SDL2 REQUIRED sdl2) 
PKG_SEARCH_MODULE(SDL2IMAGE REQUIRED) 
set(SDL2_IMAGE_INCLUDE_DIR "src/SDL2_image-2.0.2") 
include_directories("${SDL2_IMAGE_INCLUDE_DIR}") 
target_link_libraries(pacman "${SDL2_LIBRARIES} ${SDL2IMAGE_LIBRARIES}") 

和一個名爲Makefile的文件:(我不太瞭解它!不幸的是,這個錯誤終於從這裏升起)

# Makefile for showimage 

CC = gcc 
CFLAGS = $(shell sdl2-config --cflags) -Wall -O 
LIBS = $(shell sdl2-config --libs) -lSDL2_image 
EXE = showimage 

all: $(EXE) 

showimage: showimage.c Makefile 
    $(CC) -o [email protected] [email protected] $(CFLAGS) $(LIBS) 

clean: 
    -rm *.o $(EXE) 

注意,我敢肯定,我已經安裝使用這個命令所有SDL2庫100%:

sudo apt-get install libsdl2* 

和正確的工作,一切都完了,沒有任何錯誤輸出這樣的:

Reading package lists... Done 
Building dependency tree  
Reading state information... Done 
Note, selecting 'libsdl2-mixer-dev' for glob 'libsdl2*' 
Note, selecting 'libsdl2-image-dev' for glob 'libsdl2*' 
Note, selecting 'libsdl2-gfx-dev' for glob 'libsdl2*' 
Note, selecting 'libsdl2-gfx-doc' for glob 'libsdl2*' 
Note, selecting 'libsdl2-mixer-2.0-0' for glob 'libsdl2*' 
Note, selecting 'libsdl2-dev' for glob 'libsdl2*' 
Note, selecting 'libsdl2-doc' for glob 'libsdl2*' 
Note, selecting 'libsdl2-ttf-dev' for glob 'libsdl2*' 
Note, selecting 'libsdl2-net-2.0-0' for glob 'libsdl2*' 
Note, selecting 'libsdl2-net-dev' for glob 'libsdl2*' 
Note, selecting 'libsdl2-image-2.0-0' for glob 'libsdl2*' 
Note, selecting 'libsdl2-2.0-0' for glob 'libsdl2*' 
Note, selecting 'libsdl2-gfx-1.0-0' for glob 'libsdl2*' 
Note, selecting 'libsdl2-ttf-2.0-0' for glob 'libsdl2*' 
libsdl2-2.0-0 is already the newest version (2.0.6+dfsg1-3ubuntu1). 
libsdl2-dev is already the newest version (2.0.6+dfsg1-3ubuntu1). 
libsdl2-doc is already the newest version (2.0.6+dfsg1-3ubuntu1). 
libsdl2-gfx-1.0-0 is already the newest version (1.0.1+dfsg-5). 
libsdl2-gfx-dev is already the newest version (1.0.1+dfsg-5). 
libsdl2-gfx-doc is already the newest version (1.0.1+dfsg-5). 
libsdl2-image-2.0-0 is already the newest version (2.0.1+dfsg-3). 
libsdl2-image-dev is already the newest version (2.0.1+dfsg-3). 
libsdl2-mixer-2.0-0 is already the newest version (2.0.1+dfsg1-3). 
libsdl2-mixer-dev is already the newest version (2.0.1+dfsg1-3). 
libsdl2-net-2.0-0 is already the newest version (2.0.1+dfsg1-3). 
libsdl2-net-dev is already the newest version (2.0.1+dfsg1-3). 
libsdl2-ttf-2.0-0 is already the newest version (2.0.14+dfsg1-2). 
libsdl2-ttf-dev is already the newest version (2.0.14+dfsg1-2). 
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. 

感謝您的幫助beforehands :)))))

沙发
0
0

我已經通過以這種方式更改cmake代碼修復了這一切: 只需手動給出sdl目錄路徑即可!

cmake_minimum_required(VERSION 3.9) 
project(pacman C) 

set(CMAKE_C_STANDARD 99) 
set(SOURCE src/main.c src/input.c src/input.h src/view.c src/view.h src/models.h src/models.c src/controler.c src/controler.h) 
add_executable(pacman "${SOURCE}") 
include_directories(src) 

include_directories("/usr/include/SDL2") 
target_link_libraries(pacman m SDL2 SDL2_gfx SDL2_image) 

ADD_DEFINITIONS(-D_REENTRANT) 
板凳
0
0

使用find_library代替PKG_SEARCH_MODULE

find_library(SDL2_LIBRARY NAME SDL2) 
target_include_directories(pacman ${SDL2_INCLUDE_DIR}) 
target_link_libraries(pacman ${SDL2_LIBRARY}) 

如果找不到SDL2,則必須將SDL2的路徑添加到CMAKE_PREFIX_PATH,即CMake查找已安裝軟件的位置。

+0

我左邊的文件不變的休息,但改變了PKG_SEARCH_MODULE到find_library只是複製你的代碼,但這個錯誤上升{讓錯誤在的CMakeLists.txt:11(target_include_directories):調用的參數無效 target_include_directories 的CMake錯誤:在此項目中使用以下變量,但它們設置爲NOTFOUND。 請設置它們或確保它們已在CMake文件中正確設置和測試: SDL2_LIBRARY 通過目標「pacman」鏈接到目錄/ home/mrtalebi/Projects/CLionProjects/pacman} –

+0

我發現編譯器鏈接器命令:像這樣,它提高了錯誤:-o pacman -lSDL2 SDL2_image -lSDL2 –

+0

您需要甚至像我指定的方式添加target_include_directories和target_link_directories。做到這一點,並在這裏發佈會發生什麼 –

0
votes
answers
29 views
+10

Android系統錯誤與系統CMake溝通

3

我剛剛創建了一個簡單的Android項目,在OS X High Sierra上使用Android Studio 3.0.1進行C++支持,我試圖弄清楚如何獲得CMake支持。Android系統錯誤與系統CMake溝通

我無法通過Android Studio安裝CMake,因爲項目存在錯誤,並且Tools > Android選項無法通過菜單獲得。

這裏的項目是什麼樣子:

without-android-tools

爲了便於比較,這裏有沒有C++的支持表示Tools > Android選擇另一個平凡的項目。

with-android-tools

我讀一些有關配置Android Studio中使用該系統cmake。顯然,您可以覆蓋項目的local.properties文件cmake.dir設置:

https://developer.android.com/studio/projects/add-native-code.html

摘錄:

在項目中包含的

local.properties file: cmake.dir="path-to-cmake"

的路徑CMake的安裝

所以,我設置了cmake.dir/usr/local(因爲我已經安裝了cmake先前通過自制軟件,改變了屬性文件)

現在讀(與你的home目錄替換~

# ... some comments warning you not to modify 
# the properties file ... 
ndk.dir=~/Library/Android/sdk/ndk-bundle 
sdk.dir=~/Library/Android/sdk 
cmake.dir="/usr/local" 

的Android Studio現在顯示錯誤消息(換行和插入易讀性和主目錄 s的~替換):

Error:Error occurred while communicating with CMake server. 
Check log 
~/AndroidStudioProjects/Cpptest/ 
 app/.externalNativeBuild/cmake/ 
 debug/armeabi-v7a/cmake_server_log.txt 
for additional information. 

然而,CON該文件的帳篷建議cmake二進制文件對Android Studio調用的命令做出了合理的迴應。

CMAKE SERVER:- 

CMAKE SERVER: [== "CMake Server" ==[ 

CMAKE SERVER: {"supportedProtocolVersions":[{"isExperimental":true,"major":1,"minor":1}],"type":"hello"} 

CMAKE SERVER: ]== "CMake Server" ==] 

系統CMake的是版本3.10.0是大於3.7(我相信支持的最低版本)。

  • 如何「說服」Android Studio使用系統CMake?
  • 如果Tools > Android不可用,是否有方法安裝由IDE管理的CMake分配?
  • 如果這兩個選項都不太直截了,我可以配置Android Studio爲C++源代碼使用不同的構建系統,比如GNU Make或者簡單的gradle?
+0

格雷戈裏,根據https://developer.android.com/studio/projects/add-native-code.html#vanilla_cmake:_Support使用CMake的3.7,並用Android Studio中更高是一個預覽功能。如果您遇到任何問題,請報告錯誤._ 如果您提交了錯誤,請分享鏈接。 – Domi

+0

經過更多挖掘,我發現了這個錯誤報告(它引用了你的文章):https://issuetracker.google.com/issues/70378585 這個問題可能與添加對CMake Server v1.1的支持有關:https:/ /issuetracker.google.com/issues/70677697 – Domi

沙发
0
1

所以,我仍然不知道爲什麼在系統CMake指向Android Studio沒有工作。我也試圖通過他們的網站(https://cmake.org/download/)安裝一個「全CMake的」分配和指向/Applications/CMake.app/Contents/

然而,有可能在Android Studio中在OS X上以不同的方式來安裝CMakelldb即使Tools > Android沒有出現。

那就是:

Preferences > Appearance & Behavior > System Settings > Android SDK > SDK Tools 

或者等價地,Cmd的,然後在搜索字段中鍵入sdk然後單擊SDK Tools選項卡。

這是一張圖片。

enter image description here

0
votes
answers
44 views
+10

CMake FindXercesC.cmake沒有找到我的XercesC

0

在我的系統(Fedora 26)上,我使用yum(又名dnf)安裝了XercesC。所述XercesC頭文件位於
CMake FindXercesC.cmake沒有找到我的XercesC

/usr/include/xercesc-2.7.0/xercesc

和庫是

的/ usr/lib64下/ libxerces -c.so.27。

我已經試過官方FindXercesC.cmake以及一些這個包取景器的發佈版本。我也嘗試了許多編輯*.cmake文件。他們都不能找到XercesC,我不得不求助於手動輸入標題和庫的位置。

是否有一個XercesC的CMake包發現器,可以在我的系統上自動定位XercesC?

+0

如果您沒有發佈cmake代碼,很難弄清楚發生了什麼。 –

+1

目錄'/ usr/include/xercesc-2.7.0'絕對不是默認包含路徑。不知道爲什麼Fedora選擇在那裏安裝軟件包。通過設置[CMAKE_INCLUDE_PATH](https://cmake.org/cmake/help/v3.7/variable/CMAKE_INCLUDE_PATH.html)變量(從命令行或在腳本中)提示CMake。另外,你應該有一個沒有* so版本的庫,可以被CMake檢測到。將**精確錯誤消息**添加到問題文章中。 – Tsyvarev

+0

謝謝。沒有如此版本的庫位於/usr/lib64/xercesc-2.7.0。將CMAKE_INCLUDE_PATH和CMAKE_LIBRARY_PATH變量設置爲適當的目錄解決了問題。 – jsnark

沙发
0
1

通常情況下,CMake搜索的東西只在默認目錄中。例如,/usr/include目錄會自動搜索頭文件。

但是目錄/usr/include/xercesc-2.7.0不是CMake的默認值(它也不是編譯器的默認值),所以CMake在沒有明確提示的情況下找不到東西。爲了提示CMake關於include目錄的搜索,設置CMAKE_INCLUDE_PATH變量。例如,通過命令行:

cmake -DCMAKE_INCLUDE_PATH=/usr/include/xercesc-2.7.0 <other_params> 

類似的是用於搜索庫文件真:CMake的自動搜索/usr/lib64/下庫,但不低於/usr/lib64/xercesc-2.7.0。另外,CMake只能找到沒有的版本,因此版本號爲,所以它找不到文件/usr/lib64/libxerces-c.so.27。找到一個文件/usr/lib64/xercesc-2.7.0/libxerces-c.so你需要提示CMake CMAKE_LIBRARY_PATH變量。


根據該xercesc sources,它支持通過pkg-config和經由CONFIGfind_package模式搜索包。可能這些變體不需要額外的提示。

通過pkg-config搜索可以pkg_check_modulesCONFIG模式可以在本選項添加到通話find_package(XercesC),或者乾脆刪除FindXercesC.cmake腳本來執行,使用find_package

0
votes
answers
36 views
+10

在稍後定義的目標上調用get_target_property()

0

我遇到CMake get_target_property問題。它在稍後定義的庫上運行並返回錯誤。這是我的代碼:在稍後定義的目標上調用get_target_property()

add_library(UT_pal_logger OBJECT ${SOURCES}) 
target_add_interfaces(UT_pal_logger cppunit_addon) 

在其他文件有:

function(target_add_interfaces TARGET OTHER_TARGETS) 
    foreach(OTHER_TARGET ${OTHER_TARGETS}) 
     get_target_property(TMP_INCLUDES ${OTHER_TARGET} INTERFACE_INCLUDE_DIRECTORIES) 
     if(TMP_INCLUDES) 
     target_include_directories(${TARGET} PUBLIC ${TMP_INCLUDES}) 
     endif() 
    endforeach(OTHER_TARGET) 
endfunction() 

和:

add_library(cppunit_addon STATIC ${SOURCES}) 
target_include_directories(cppunit_addon PUBLIC Include) 

注意cppunit_addon帶來了在UT_pal_logger使用一些頭。

這失敗的消息:

CMake Error at Scripts/CMake/target_add_interfaces.cmake:22 (get_target_property): 
    get_target_property() called with non-existent target "cppunit_addon". 
Call Stack (most recent call first): 
    .../logger/CMakeLists.txt:36 (target_add_interfaces) 

但是這種配置和構建就好:

add_library(UT_pal_logger STATIC ${SOURCES}) 
target_link_libraries(UT_pal_logger cppunit_addon) 

--->target_link_libraries莫名其妙地等待,直到一切都被解析並get_target_property沒有。這也是documented

此命令,可以獲取屬性迄今創建的任何目標

我也可以更改add_directory命令的順序來解決這個問題。但這不是一個乾淨的解決方案。我怎麼能讓get_target_property等到一切都被解析了?

+0

通常包括任何依賴性也需要一個鏈接依賴性。所以我承認,我不明白你想要達到什麼'target_add_interfaces()'函數?如果你有鏈接依賴,你的問題就解決了(公共include目錄會自動傳播)。 – Florian

+0

@Florian,他正試圖爲* OBJECT *庫添加包含目錄:https://stackoverflow.com/questions/47831517/cmake-add-interfaces-but-do-not-link。 – Tsyvarev

沙发
0
1

如果您希望CMake在生成時評估您的財產,而不是在配置時間期間,您總是可以使用generator expressions

如果成功地測試了下面的代碼片斷:

add_library(UT_pal_logger OBJECT ${SOURCES}) 
target_include_directories(
    UT_pal_logger 
    PUBLIC "$<TARGET_PROPERTY:cppunit_addon,INTERFACE_INCLUDE_DIRECTORIES>" 
) 
0
votes
answers
28 views
+10

CMake和標頭搜索路徑

0

我將一個項目移植到CMake,並努力尋找如何設置標頭搜索路徑(以前使用編譯器標誌設置,例如-I "../../Source")。CMake和標頭搜索路徑

我目前有:

target_include_directories (jni-bridge PRIVATE 
    "../../Analysis" 
    "../../Source" 
) 

但是,這是行不通的。我應該如何設置路徑,以及它們相對於哪個位置?

+0

爲什麼不在高級CMakeLists.txt的搜索路徑中添加這些目錄?如果這些不是當前CMake項目的一部分,那麼最好使用一些CMake變量添加這些目錄,以使項目具有可移植性。 –

沙发
0
0

在內部,CMake使用絕對路徑作爲包括目錄。如果相對路徑與target_include_directories一起使用,則將相對於當前源目錄${CMAKE_CURRENT_SOURCE_DIR})進行解釋。


上面時發生器表達式不使用是真實的。

生成器表達式$<INSTALL_INTERFACE:..>可能(並強烈建議)使用相對於安裝前綴解釋的相對路徑。

發生器表達式$<BUILD_INTERFACE:...>應該使用絕對路徑。

0
votes
answers
38 views
+10

cmake的鏈接GLEW頭文件

1

我想外部庫添加到使用CMake的我的項目(V 3.10.1)cmake的鏈接GLEW頭文件

我希望庫生活在一個特定的目錄,因爲我喜歡保持清潔儘可能

我的項目結構看起來像

Project 
    | 
    |-- main.cpp 
    |-- CMakeLists.txt (top lvl) 
    | 
    |-- libs/ 
     | 
     | -- glew-1.13.0 
     | -- CMakeLists.txt (lib lvl) 

熱門拉特的CMakeLists.txt

cmake_minimum_required (VERSION 2.6) 
project (myproject) 
add_executable(myproject main.cpp) 

add_subdirectory (libs) 

庫LVL CMakeList.txt

### GLEW ### 

include_directories(
    glew-1.13.0/include/ 
) 

set(GLEW_SOURCE 
    glew-1.13.0/src/glew.c 
) 

set(GLEW_HEADERS 
) 

add_library(GLEW_1130 STATIC 
    ${GLEW_SOURCE} 
    ${GLEW_INCLUDE} 
) 

target_link_libraries(GLEW_1130 
    ${OPENGL_LIBRARY} 
    ${EXTRA_LIBS} 
) 

的main.cpp

#include <iostream> 
#include <GL/glew.h> 


int main() { 

    std::cout << "Hello World" << std::endl; 
    return 0; 
} 

<GL/glew.h> headerfile not found

我是什麼」在我丟失的情況下,這樣我就可以使用GLEW頭文件?

沙发
0
2

include_directories影響是不是全球:從libs/CMakeLists.txt執行,但不會對頂級CMakeLists.txt影響。

您可以 「附加」 包括目錄庫目標

# In libs/CMakeLists.txt 
target_include_directories(GLEW_1130 PUBLIC glew-1.13.0/include/) 

所以futher與該庫鏈接爲目標

# In CMakeLists.txt 
target_link_libraries(myproject GLEW_1130) 

會自動傳播它包括目錄可執行文件。

+0

的感謝!那就是訣竅 – abdoe

板凳
0
0

請勿將add_subdirectory第三方投影到您自己的構建系統中,否則會污染您的配置。這裏是一個合理的方法是在系統上安裝GLEW,並使用find_package,以它作爲項目的一部分:

cmake_minimum_required (VERSION 2.6) 
project (myproject) 
find_package(glew 1.13.0) 
add_executable(myproject main.cpp) 
target_link_libraries(myproject GLEW::glew) 
0
votes
answers
33 views
+10

在add_custom_command中連接多個文件

0

我們的應用程序需要提供一個.xsd文件,該文件由多個其他.xsd文件連接在一起組成。連接的源列表可以通過遍歷所有庫依賴關係並檢查其上的屬性來派生。在add_custom_command中連接多個文件

我最終什麼樣的主意是,應用程序的可的CMakeLists.txt只是調用一個函數,它會「做正確的事」:工作

function(make_config_xsd) 
    set(xsd_config ${CMAKE_CURRENT_BINARY_DIR}/config.xsd) 

    # build up a list of config files that are going to be concatenated 
    set(config_list ${appcommon_SOURCE_DIR}/config/common.xsd) 

    # iterate over the library dependencies and pull out config_file properties 
    get_target_property(libraries ${PROJECT_NAME} LINK_LIBRARIES) 
    foreach(lib ${libraries}) 
     get_target_property(conf ${lib} config_file) 
     if(conf) 
      list(APPEND config_list ${conf}) 
     endif() 
    endforeach() 

    # finally, add the app specific one last 
    list(APPEND config_list ${PROJECT_SOURCE_DIR}/config/config.xsd) 

    add_custom_command(OUTPUT ${xsd_config} 
     COMMAND echo "<?xml version=\"1.0\"?><xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">" > ${xsd_config} 
     COMMAND cat ${config_list} >> ${xsd_config} 
     COMMAND echo "</xs:schema>" >> ${xsd_config} 
     DEPENDS "${config_list}") 

    add_custom_target(generate-config DEPENDS ${xsd_config}) 
    add_dependencies(${PROJECT_NAME} generate-config) 
endfunction() 

出現。但我不確定它是否真的是解決這個問題的「正確方法」,並假設add_custom_target()只取決於add_custom_command()的輸出,這樣我就可以做add_dependencies()似乎也不錯。有沒有一種更直接的方式來執行這種生成文件的依賴關係?

+0

如果其他自定義命令或自定義的目標取決於您的配置文件,無需要創建額外的定製目標。在庫或可執行文件的情況下,可以通過將文件添加到源文件列表來指定對文件的依賴性。 – Tsyvarev

+0

1.關於add_custom_command(TARGET $ {PROJECT_NAME} POST_BUILD ....)怎麼辦? 2.比較喜歡使用COMMAND $ {CMAKE_COMMAND} -E,不幸的是沒有任何cat concat 3.您可以使用FILE(READ ...)FILE(WRITE)cf. [在cmake郵件列表上的這篇文章](https://cmake.org/pipermail/cmake/2010-July/038028.html) –

沙发
0
0

由於Tsyvarev指出,只需將生成配置文件添加到目標的源列表。

也就是說,替換:

add_custom_target(generate-config DEPENDS ${xsd_config}) 
add_dependencies(${PROJECT_NAME} generate-config) 

只:

target_sources(${PROJECT_NAME} ${xsd_config}) 
0
votes
answers
43 views
+10

使用Visual Studio 2015的cmake

0

我有一個C++庫(retdec-CPP),這是我建立並使用安裝CMake的3.10.0使用Visual Studio 2015的cmake

我想在一個Visual Studio 2015的項目中使用這個庫(此特定版本是需要的)。我知道需要單獨構建調試和發佈,因此我遵循this guide

現在我想用這個c。使用CMake的++庫在我的Visual Studio項目,但我有寫作的CMakeLists.txt

麻煩這是怎麼它現在看起來:

project(prog CXX) 
cmake_minimum_required(VERSION 3.6) 

find_package(Threads) 


set(RETDEC_SRC_DIR "C:/Users/kkkkk/Desktop/retdec-cpp") 
set(RETDEC_BUILD_DIR "C:/Users/kkkkk/Desktop/retdec-cpp/build") 

#added : 
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") 
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib") 
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib") 
# 

include_directories(SYSTEM "${RETDEC_SRC_DIR}/include") 
link_directories(
    "${RETDEC_BUILD_DIR}/debug/src/retdec" 
    "${RETDEC_BUILD_DIR}/debug/third_party/src/cpp-netlib-build/libs/network/src" 
    "${RETDEC_BUILD_DIR}/debug/src/json-cpp-build/src/lib_json" 
    "${RETDEC_BUILD_DIR}/release/src/retdec" 
    "${RETDEC_BUILD_DIR}/release/third_party/src/cpp-netlib-build/libs/network/src" 
    "${RETDEC_BUILD_DIR}/release/src/json-cpp-build/src/lib_json" 

) 


add_executable(prog prog.cpp) 
target_link_libraries(
retdec 
    boost_filesystem 
    boost_system 
    boost_thread 
    boost_chrono 
    boost_date_time 
    boost_atomic 
    ssl 
    crypto 
    cppnetlib-uri 
    cppnetlib-client-connections 
    jsoncpp 
    ${CMAKE_THREAD_LIBS_INIT} 

) 

當我建立它在Visual Studio中,它不斷上顯示此錯誤:
LNK1104:無法打開文件retdec.lib

顯然有一些錯誤的,我CMakeLists。

如何在使用Cmake的Visual Studio 2015項目中包含此庫?

+0

「retdec.lib」在你的鏈接目錄之一中嗎?我不希望事實如此。它們看起來像源文件夾。 – drescherjm

+0

您需要爲現有目標調用target_link_libraries,即您應該用'prog'作爲第一個參數來調用它。 – vre

+0

如果該文件夾存在於該文件夾中,可能是混合了32位和64位。 – drescherjm

沙发
0
0

從錯誤的問題:從事實

LNK1104:cannot open file retdec.lib

結果,所有你在link_directories()調用指定的目錄中,似乎並不包括retdec.lib您正在試圖連接的內功能target_link_libraries()

解決方法很簡單:

  • 找到retdec.lib的位置,並把它放在你已經鏈接的一個文件夾(我在你link_directories發現一個item調用價值:"${RETDEC_BUILD_DIR}/release/src/retdec"是這樣的按照名稱來判斷,它好像是src文件的目錄,而不是libs。在哪裏尋找類似"${RETDEC_BUILD_DIR}/release/lib"的東西?)。
  • 或者,您可以找到retdec.lib的位置,然後將該目錄添加到您的link_directories()列表中。
板凳
0
0

我只用了以改變填充邊緣,使其發生..

+0

是的,請檢查我的答案,以另一個選項使用'overflow:hidden'。 –