2010-01-18 59 views
5

Tôi là nhà phát triển C++ viết một trò chơi ban đầu trên nền tảng Mac bằng XCode, nhưng bây giờ chuyển sang nền tảng chéo bằng cách tận dụng CMake. Cho đến nay tôi có thể làm cho nó được biên dịch trên netbook ickle linux của tôi và tôi đang đặt cùng một môi trường dev trên máy này cho trên mã hóa đi. Tuy nhiên tôi thấy rằng gcc biên dịch lại mọi tệp bất cứ khi nào tôi thực hiện thay đổi. Rõ ràng tôi cần một số cấu hình bổ sung cho CMakeLists.txt. Cái hiện tại của tôi rất đơn giản. Như vậy;cmake & gcc biên dịch mọi tệp mỗi lần

cmake_minimum_required (VERSION 2.8) 
set (source 
Creature.cpp 
DisplayManager.cpp 
Engine.cpp 
EngineState.cpp 
Entity.cpp 
GameWorld.cpp 
GfxSFML.cpp 
Item.cpp 
Map.cpp 
Position.cpp 
Projectile.cpp 
ScreenTile.cpp 
SquadAI.cpp 
Terrain.cpp 
UIButton.cpp 
UICharPanel.cpp 
UIView.cpp 
Utility.cpp 
Weapon.cpp 
fov.cpp 
main.cpp 
) 

find_package (OpenAL) 
find_package (OpenGL) 
find_package (SFML) 

set(CMAKE_CXX_FLAGS "-g -Wall -pg") 
add_executable (tractionedge ${source}) 
target_link_libraries(tractionedge ${SFML_LIBRARY} ${OPENGL_LIBRARY} ${OPENAL_LIBRARY}) 

Tôi đã tập trung cho đến nay trên C++ làm ngôn ngữ thay vì xây dựng hệ thống bằng cách gắn kết với XCode cho mọi thứ. Kiến thức của tôi về Autotools (make?) Và Gcc rất hạn chế. Làm cách nào để gcc chỉ biên dịch lại nguồn đã thay đổi?

Trả lời

3

Chỉ tạo lại các nguồn được sửa đổi NÊN là hành vi mặc định. Tất nhiên nếu bạn thay đổi một tiêu đề trung tâm bao gồm bởi gần như tất cả các tập tin cpp phụ thuộc nó sẽ kích hoạt một xây dựng lại gần như hoàn thành. Hãy xem điều gì sẽ xảy ra nếu bạn chỉ sửa đổi một tệp cpp (thêm nhận xét hoặc giống nhau), nếu nhiều hơn đơn vị biên dịch đó biên dịch thì tôi đề nghị bạn đầu tư nhiều thời gian hơn để điều tra nó. .

Một khả năng khác là bạn đang biên soạn dưới cửa sổ và sử dụng đĩa 2.8 cm có lỗi liên quan đến điều này. Hãy xem phiên bản 2.9 để xem lỗi đó có bị xóa hay không: http://www.mail-archive.com/[email protected]/msg24876.html

0

Tôi sẽ viết lại CMakeLists.txt của bạn bằng glob (có thể di chuyển tệp trong thư mục "src" nếu bạn có tệp * .cpp khác xung quanh) và đặt tên cho dự án của bạn (điều này đặt ra một số biến quan trọng):

cmake_minimum_required (VERSION 2.8) 
project(TRACTION) 
file (GLOB TRACTION_SOURCES *.cpp) 
find_package (OpenAL) 
find_package (OpenGL) 
find_package (SFML) 

set(CMAKE_CXX_FLAGS "-g -Wall -pg") 
add_executable (tractionedge ${TRACTION_SOURCES}) 
target_link_libraries(tractionedge ${SFML_LIBRARY} ${OPENGL_LIBRARY} ${OPENAL_LIBRARY}) 
+2

Bạn không nên sử dụng 'GLOB()' vì nếu bạn thêm tệp '.cpp' mới, CMake sẽ không biết về nó và do đó sẽ không tự động chạy lại. Trong trường hợp này, bạn sẽ phải tự chạy cmake một lần nữa, buộc phải xây dựng lại toàn bộ mọi thứ. – Milliams

+5

Tôi không đồng ý. Nhìn vào một số dự án lớn với tấn tệp src (opencv), họ sử dụng GLOB ở khắp mọi nơi, và có, họ chạy lại cmake khi tệp mới được thêm vào (nhưng đó là điều bạn phải làm): "cmake" ít gánh nặng hơn chỉnh sửa các CMakeLists và ... chạy cmake để cập nhật các makefiles !! – gaspard

+1

Milliams, bạn hoàn toàn sai, tôi chỉ thử chạy "cmake" sau khi hoàn thành (và lớn): không đánh dấu tất cả các tệp là dơ bẩn. – gaspard

6

Bạn có định tuyến lại cmake mỗi lần? Nếu bạn chỉ sửa đổi một tệp nguồn, bạn sẽ có thể chỉ cần chạy lại make và nó sẽ xây dựng lại chỉ một tệp đối tượng trước khi liên kết. Nếu bạn chạy lại cmake, nó có thể đánh dấu tất cả các tệp nguồn bị bẩn và xây dựng lại mọi thứ.

Chỉ chạy lại cmake nếu bạn thay đổi danh sách tệp nguồn thực tế đang được sử dụng hoặc các thay đổi lớn khác như vậy.

+0

Trong thực tế, bạn vẫn có thể chạy 'make' vì điều đó sẽ kiểm tra xem có bất kỳ phụ thuộc nào đã được cập nhật hay không. – Milliams

0

Tôi cũng đã trải qua việc xây dựng lại không cần thiết bằng cách sử dụng cmake và studio trực quan. Vấn đề có liên quan đến một tham số cấu hình x64 không phù hợp: Visual Studio 2008 Unnecessary Project Building

-2

Một giải pháp đơn giản trong nhiều trường hợp này là hoàn toàn lau cây xây dựng và tái tạo nó (và tôi có nghĩa cái gì đó dọc theo dòng của rm -rf build && mkdir build && cd build && cmake -G "Unix Makefiles" ../src, không chỉ make clean)

Các vấn đề liên quan