LINUX.ORG.RU

NetBeans 6.1 C++


0

0

Простой проект из двух файлов.

//---------
// newfile.h

class CTest {
public:
	CTest() {
	}
	~CTest() {
	}
	void Print() {
		printf("test 1\n");
	}
};

//---------
// main.cpp

#include "newfile.h"

int main(int argc, char** argv) {
	CTest t;
	t.Print();
    return (EXIT_SUCCESS);
}



Компилируем и запускаем. В консоли получаем "test 1" - все правильно.

Исправляем "test 1" на "test 2" в файле newfile.h. Компилируем (изменения в файле сохраняются на диск автоматом) и запускаем. В консоли все тот же "test 1".

NetBeans не проверяет зависимости перед сборкой.
Для проекта из нескольких маленьких файлов это не критично - можно сделать ребилд всему проекту, но как быть с большими проектами?

Неужели разработчики NetBeans не тестировали его перед выпуском?

Система Linux, gcc 4.1.2
★★★★★

Ответ на: комментарий от wfrr

> make clean

И чем это отличается от ребилда всего проекта?

andreyu ★★★★★
() автор топика
Ответ на: комментарий от wfrr

Это тут при чём? Любая адыкватная IDE? (ну или система сборки) должна отслеживать изменения в каждом файле проекта... тут видимо этого не делается... маразм... уж лучше emacs + autotools

Cy6erBr4in ★★★
()
Ответ на: комментарий от Cy6erBr4in

В 6.0 нетбинс юзает make, если make не справляется то это не проблемы netbeans, если вам хочется пофекализировать на нетбинс ищите чтото другое.

wfrr ★★☆
()
Ответ на: комментарий от Cy6erBr4in

> Любая адыкватная IDE? (ну или система сборки) должна отслеживать изменения в каждом файле проекта...

Должна, но не делает :(

> тут видимо этого не делается... маразм...

Согласен, маразм. Надеюсь это лечится. В настройках NetBeans есть "Enable dependency checking in generated makefiles (Sun Studio make and dmake only)". Естественно, что включение или выключение данной опции не влияет на рез-т.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от wfrr

> В 6.0 нетбинс юзает make, если make не справляется то это не проблемы netbeans, если вам хочется пофекализировать на нетбинс ищите чтото другое.

Празительно, но на той же системе Code::Blocks и KDevelop зависимости просекают корректно. Если мне не изменяет память, то Code::Blocks использует свою реализацию dependency checker. Какой смысл называть NetBeans IDE, если элементарную, но очень нужную функцию эта "IDE" выполнить не в состоянии. Не нужно валить эту беду на gnu make.

Если вам нечего сказать по этой теме, то просто не отвечайте.

andreyu ★★★★★
() автор топика

> Неужели разработчики NetBeans не тестировали его перед выпуском?

Тчорт, нас спалили!

// разработчики NetBeans

anonymous
()
Ответ на: комментарий от andreyu

>Празительно, но на той же системе Code::Blocks и KDevelop зависимости просекают корректно. Если мне не изменяет память, то Code::Blocks использует свою реализацию dependency checker.

Можете свою написать или указать в каком месте кривость make повлияла на нетбинс.

wfrr ★★☆
()
Ответ на: комментарий от wfrr

> Можете свою написать или указать в каком месте кривость make повлияла на нетбинс.

Я не пытаюсь оскорбить ваши чувства по отношению к NetBeans. Меня интересует только способ решения поставленного мной вопроса. Если решения нет, то я и дальше буду пользоваться VIM и Code::Blocks.
Просто последний весьма ужасен под Mac OS X.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от andreyu

>Я не пытаюсь оскорбить ваши чувства по отношению к NetBeans.

Вы плохой телепат.

>Меня интересует только способ решения поставленного мной вопроса.

Курите конфигурацию make, если она может решит вашу проблему то хорошо, иначе используйте другую систему сборки.

wfrr ★★☆
()
Ответ на: комментарий от wfrr

> Курите конфигурацию make, если она может решит вашу проблему то хорошо, иначе используйте другую систему сборки.

Из мана по make "make updates a target if it depends on prerequisite files that have been modified since the target was last modified, or if the target does not exist."

Но как оно работает?

Так же нашел опцию:
-o file, --old-file=file, --assume-old=file
Do not remake the file file even if it is older than its dependencies, and do not remake anything on account of changes in file.
Essentially the file is treated as very old and its rules are ignored.

Такое ощущение, что нетбинс использует ее во всех случаях кроме полного ребилда проекта.
Оптимизация времени сборки, млин.

andreyu ★★★★★
() автор топика

Сдаётся мне тут проблема не в make, а в том, что сетевые бобы неправильно генерят мейкфайл... глянь, что там? кинь сюда

Cy6erBr4in ★★★
()

Как уже здесь посоветовали - используйте другую систему сборки. Я пользуюсь CMake под Eclipse, KDevelop и для ручной сборки. Думаю и в NetBeans должен встраиваться без проблем. Вообще зависимость проекта от IDE считаю моветоном, тот же CMake позволяет легко сменить один редактор на другой без каких либо усилий.

Dendy ★★★★★
()
Ответ на: комментарий от Dendy

> Как уже здесь посоветовали - используйте другую систему сборки. Я пользуюсь CMake

Думаю, что нормально (вручную) написанный Makefile всё исправит.

tailgunner ★★★★★
()
Ответ на: комментарий от andreyu

Зафайлил баг: http://www.netbeans.org/issues/show_bug.cgi?id=134524

В случае managed проектов (т.е. таких, для которых make файлы генерятся) сделать такую фичу очень даже можно.

Хотя, надо сказать, под Виндами на MS Visual Studio все живут и не дёргаются по этому поводу - она тоже это не умеет отслеживать.

anonymous
()
Ответ на: комментарий от anonymous

> Хотя, надо сказать, под Виндами на MS Visual Studio все живут и не дёргаются по этому поводу - она тоже это не умеет отслеживать.

MS VS в частности и даже MS вообще можно не любить, но зачем неправду-то говорить? Visual Studio (для определенности 2003) отслеживает зависимости от заголовочных файлов.

anonymous
()
Ответ на: комментарий от anonymous

> Хотя, надо сказать, под Виндами на MS Visual Studio все живут и не дёргаются по этому поводу - она тоже это не умеет отслеживать.

За первые версии MS VC ничего не скажу - было давно очень, но MS VC 6 и старше, прекрасно все отслеживает.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от andreyu

Более того, это прекрасно отслеживается и в той же Anjuta, да и вообще в любой среде, которая правильно генерит Makefile`ы :) ты так кстати и не показал, что же нетбинс пишет в Makefile, давай глянем? ;)

Cy6erBr4in ★★★
()
Ответ на: комментарий от Cy6erBr4in

> Более того, это прекрасно отслеживается и в той же Anjuta, да и вообще в любой среде, которая правильно генерит Makefile`ы :) ты так кстати и не показал, что же нетбинс пишет в Makefile, давай глянем? ;)

Был на даче.

Но, сдается мне, проблема в параметре "-o" - именно он прописан как опция. И исправить / удалить его не удается.

--- Makefile ---

#
#  There exist several targets which are by default empty and which can be
#  used for execution of your targets. These targets are usually executed
#  before and after some main targets. They are:
#
#     .build-pre:              called before 'build' target
#     .build-post:             called after 'build' target
#     .clean-pre:              called before 'clean' target
#     .clean-post:             called after 'clean' target
#     .clobber-pre:            called before 'clobber' target
#     .clobber-post:           called after 'clobber' target
#     .all-pre:                called before 'all' target
#     .all-post:               called after 'all' target
#     .help-pre:                called before 'help' target
#     .help-post:               called after 'help' target
#
#  Targets beginning with '.' are not intended to be called on their own.
#
#  Main targets can be executed directly, and they are:
#
#     build                    build a specific configuration
#     clean                    remove built files from a configuration
#     clobber                  remove all built files
#     all                      build all configurations
#     help                     print help mesage
#
#  Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and
#  .help-impl are implemented in nbproject/makefile-impl.mk.
#
# NOCDDL


# Environment
MKDIR=mkdir
CP=cp
CCADMIN=CCadmin
RANLIB=ranlib


# build
build: .build-pre .build-impl .build-post

.build-pre:
# Add your pre 'build' code here...

.build-post:
# Add your post 'build' code here...


# clean
clean: .clean-pre .clean-impl .clean-post

.clean-pre:
# Add your pre 'clean' code here...

.clean-post:
# Add your post 'clean' code here...


# clobber
clobber: .clobber-pre .clobber-impl .clobber-post

.clobber-pre:
# Add your pre 'clobber' code here...

.clobber-post:
# Add your post 'clobber' code here...


# all
all: .all-pre .all-impl .all-post

.all-pre:
# Add your pre 'all' code here...

.all-post:
# Add your post 'all' code here...


# help
help: .help-pre .help-impl .help-post

.help-pre:
# Add your pre 'help' code here...

.help-post:
# Add your post 'help' code here...



# include project implementation makefile
include nbproject/Makefile-impl.mk

--------------

--- nbproject/Makefile-impl.mk ---

#
# Generated Makefile - do not edit!
#
# Edit the Makefile in the project folder instead (../Makefile). Each target
# has a pre- and a post- target defined where you can add customization code.
#
# This makefile implements macros and targets common to all configurations.
#
# NOCDDL


# Building and Cleaning subprojects are done by default, but can be controlled with the SUB
# macro. If SUB=no, subprojects will not be built or cleaned. The following macro
# statements set BUILD_SUB-CONF and CLEAN_SUB-CONF to .build-reqprojects-conf
# and .clean-reqprojects-conf unless SUB has the value 'no'
SUB_no=NO
SUBPROJECTS=${SUB_${SUB}}
BUILD_SUBPROJECTS_=.build-subprojects
BUILD_SUBPROJECTS_NO=
BUILD_SUBPROJECTS=${BUILD_SUBPROJECTS_${SUBPROJECTS}}
CLEAN_SUBPROJECTS_=.clean-subprojects
CLEAN_SUBPROJECTS_NO=
CLEAN_SUBPROJECTS=${CLEAN_SUBPROJECTS_${SUBPROJECTS}}


# Project Name
PROJECTNAME=test

# Active Configuration
DEFAULTCONF=Debug
CONF=${DEFAULTCONF}

# All Configurations
ALLCONFS=Debug Release


# build
.build-impl: .validate-impl
        @#echo "=> Running $@... Configuration=$(CONF)"
        ${MAKE} -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .build-conf


# clean
.clean-impl: .validate-impl
        @#echo "=> Running $@... Configuration=$(CONF)"
        ${MAKE} -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .clean-conf


# clobber
.clobber-impl:
        @#echo "=> Running $@..."
        for CONF in ${ALLCONFS}; \
        do \
            ${MAKE} -f nbproject/Makefile-$${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .clean-conf; \
        done

# all
.all-impl:
        @#echo "=> Running $@..."
        for CONF in ${ALLCONFS}; \
        do \
            ${MAKE} -f nbproject/Makefile-$${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .build-conf; \
        done


# configuration validation
.validate-impl:
        @if [ ! -f nbproject/Makefile-${CONF}.mk ]; \
        then \
            echo ""; \
            echo "Error: can not find the makefile for configuration '${CONF}' in project ${PROJECTNAME}"; \
            echo "See 'make help' for details."; \
            echo "Current directory: " `pwd`; \
            echo ""; \
        fi
        @if [ ! -f nbproject/Makefile-${CONF}.mk ]; \
        then \
            exit 1; \
        fi


# help
.help-impl:
        @echo "This makefile supports the following configurations:"
        @echo "    ${ALLCONFS}"
        @echo ""
        @echo "and the following targets:"
        @echo "    build  (default target)"
        @echo "    clean"
        @echo "    clobber"
        @echo "    all"
        @echo "    help"
        @echo ""
        @echo "Makefile Usage:"
        @echo "    make [CONF=<CONFIGURATION>] [SUB=no] build"
        @echo "    make [CONF=<CONFIGURATION>] [SUB=no] clean"
        @echo "    make [SUB=no] clobber"
        @echo "    make [SUB=no] all"
        @echo "    make help"
        @echo ""
        @echo "Target 'build' will build a specific configuration and, unless 'SUB=no',"
        @echo "    also build subprojects."
        @echo "Target 'clean' will clean a specific configuration and, unless 'SUB=no',"
        @echo "    also clean subprojects."
        @echo "Target 'clobber' will remove all built files from all configurations and,"
        @echo "    unless 'SUB=no', also from subprojects."
        @echo "Target 'all' will will build all configurations and, unless 'SUB=no',"
        @echo "    also build subprojects."
        @echo "Target 'help' prints this message."
        @echo ""

----------

andreyu ★★★★★
() автор топика
Ответ на: комментарий от Cy6erBr4in

# Makefile-Release.mk # # Gererated Makefile - do not edit! # # Edit the Makefile in the project folder instead (../Makefile). Each target # has a -pre and a -post target defined where you can add customized code. # # This makefile implements configuration specific macros and targets.

# Environment MKDIR=mkdir CP=cp CCADMIN=CCadmin RANLIB=ranlib CC=gcc.exe CCC=g++.exe CXX=g++.exe FC=

# Include project Makefile include Makefile

# Object Directory OBJECTDIR=build/Release/MinGW-Windows

# Object Files OBJECTFILES= \ ${OBJECTDIR}/app.o

# C Compiler Flags CFLAGS=

# CC Compiler Flags CCFLAGS= CXXFLAGS=

# Fortran Compiler Flags FFLAGS=

# Link Libraries and Options LDLIBSOPTIONS=

# Build Targets .build-conf: ${BUILD_SUBPROJECTS} dist/Release/MinGW-Windows/application_1.exe

dist/Release/MinGW-Windows/application_1.exe: ${OBJECTFILES} ${MKDIR} -p dist/Release/MinGW-Windows ${LINK.cc} -o dist/Release/MinGW-Windows/application_1 ${OBJECTFILES} ${LDLIBSOPTIONS}

${OBJECTDIR}/app.o: app.cxx ${MKDIR} -p ${OBJECTDIR} $(COMPILE.cc) -O2 -o ${OBJECTDIR}/app.o app.cxx

# Subprojects .build-subprojects:

# Clean Targets .clean-conf: ${RM} -r build/Release ${RM} dist/Release/MinGW-Windows/application_1.exe

# Subprojects .clean-subprojects:

# Enable dependency checking .KEEP_STATE: .KEEP_STATE_FILE:.make.state.${CONF}

#Makefile-Debug.mk # # Gererated Makefile - do not edit! # # Edit the Makefile in the project folder instead (../Makefile). Each target # has a -pre and a -post target defined where you can add customized code. # # This makefile implements configuration specific macros and targets.

# Environment MKDIR=mkdir CP=cp CCADMIN=CCadmin RANLIB=ranlib CC=gcc.exe CCC=g++.exe CXX=g++.exe FC=

# Include project Makefile include Makefile

# Object Directory OBJECTDIR=build/Debug/MinGW-Windows

# Object Files OBJECTFILES= \ ${OBJECTDIR}/app.o

# C Compiler Flags CFLAGS=

# CC Compiler Flags CCFLAGS= CXXFLAGS=

# Fortran Compiler Flags FFLAGS=

# Link Libraries and Options LDLIBSOPTIONS=

# Build Targets .build-conf: ${BUILD_SUBPROJECTS} dist/Debug/MinGW-Windows/application_1.exe

dist/Debug/MinGW-Windows/application_1.exe: ${OBJECTFILES} ${MKDIR} -p dist/Debug/MinGW-Windows ${LINK.cc} -o dist/Debug/MinGW-Windows/application_1 ${OBJECTFILES} ${LDLIBSOPTIONS}

${OBJECTDIR}/app.o: app.cxx ${MKDIR} -p ${OBJECTDIR} $(COMPILE.cc) -g -o ${OBJECTDIR}/app.o app.cxx

# Subprojects .build-subprojects:

# Clean Targets .clean-conf: ${RM} -r build/Debug ${RM} dist/Debug/MinGW-Windows/application_1.exe

# Subprojects .clean-subprojects:

# Enable dependency checking .KEEP_STATE: .KEEP_STATE_FILE:.make.state.${CONF}

reich
()
Ответ на: комментарий от Cy6erBr4in

$ cat Makefile-Debug.mk
#
# Gererated Makefile - do not edit!
#
# Edit the Makefile in the project folder instead (../Makefile). Each target
# has a -pre and a -post target defined where you can add customized code.
#
# This makefile implements configuration specific macros and targets.


# Environment
MKDIR=mkdir
CP=cp
CCADMIN=CCadmin
RANLIB=ranlib
CC=gcc
CCC=g++
CXX=g++
FC=

# Include project Makefile
include Makefile

# Object Directory
OBJECTDIR=build/Debug/GNU-Linux-x86

# Object Files
OBJECTFILES= \
        ${OBJECTDIR}/_ext/home/andrey/projects/NetBeansProjects/test/src/main.o

# C Compiler Flags
CFLAGS=

# CC Compiler Flags
CCFLAGS=--keep-going
CXXFLAGS=--keep-going

# Fortran Compiler Flags
FFLAGS=

# Link Libraries and Options
LDLIBSOPTIONS=

# Build Targets
.build-conf: ${BUILD_SUBPROJECTS} dist/Debug/GNU-Linux-x86/test

dist/Debug/GNU-Linux-x86/test: ${OBJECTFILES}
        ${MKDIR} -p dist/Debug/GNU-Linux-x86
        ${LINK.cc} -o dist/Debug/GNU-Linux-x86/test ${OBJECTFILES} ${LDLIBSOPTIONS}

${OBJECTDIR}/_ext/home/andrey/projects/NetBeansProjects/test/src/main.o: /home/andrey/projects/NetBeansProjects/test/src/main.cpp
        ${MKDIR} -p ${OBJECTDIR}/_ext/home/andrey/projects/NetBeansProjects/test/src
        $(COMPILE.cc) -g -o ${OBJECTDIR}/_ext/home/andrey/projects/NetBeansProjects/test/src/main.o /home/andrey/projects/NetBeansProjects/test/src/main.cpp

# Subprojects
.build-subprojects:

# Clean Targets
.clean-conf:
        ${RM} -r build/Debug
        ${RM} dist/Debug/GNU-Linux-x86/test

# Subprojects
.clean-subprojects:

----------

$ cat Makefile-Release.mk
#
# Gererated Makefile - do not edit!
#
# Edit the Makefile in the project folder instead (../Makefile). Each target
# has a -pre and a -post target defined where you can add customized code.
#
# This makefile implements configuration specific macros and targets.


# Environment
MKDIR=mkdir
CP=cp
CCADMIN=CCadmin
RANLIB=ranlib
CC=gcc
CCC=g++
CXX=g++
FC=

# Include project Makefile
include Makefile

# Object Directory
OBJECTDIR=build/Release/GNU-Linux-x86

# Object Files
OBJECTFILES= \
        ${OBJECTDIR}/_ext/home/andrey/projects/NetBeansProjects/test/src/main.o

# C Compiler Flags
CFLAGS=

# CC Compiler Flags
CCFLAGS=
CXXFLAGS=

# Fortran Compiler Flags
FFLAGS=

# Link Libraries and Options
LDLIBSOPTIONS=

# Build Targets
.build-conf: ${BUILD_SUBPROJECTS} dist/Release/GNU-Linux-x86/test

dist/Release/GNU-Linux-x86/test: ${OBJECTFILES}
        ${MKDIR} -p dist/Release/GNU-Linux-x86
        ${LINK.cc} -o dist/Release/GNU-Linux-x86/test ${OBJECTFILES} ${LDLIBSOPTIONS}

${OBJECTDIR}/_ext/home/andrey/projects/NetBeansProjects/test/src/main.o: /home/andrey/projects/NetBeansProjects/test/src/main.cpp
        ${MKDIR} -p ${OBJECTDIR}/_ext/home/andrey/projects/NetBeansProjects/test/src
        $(COMPILE.cc) -O2 -o ${OBJECTDIR}/_ext/home/andrey/projects/NetBeansProjects/test/src/main.o /home/andrey/projects/NetBeansProjects/test/src/main.cpp

# Subprojects
.build-subprojects:

# Clean Targets
.clean-conf:
        ${RM} -r build/Release
        ${RM} dist/Release/GNU-Linux-x86/test

# Subprojects
.clean-subprojects:

# Enable dependency checking
.KEEP_STATE:
.KEEP_STATE_FILE:.make.state.${CONF}

andreyu ★★★★★
() автор топика
Ответ на: комментарий от Cy6erBr4in

> Мне кажется должны присутствовать ещё как минимум два файла

Не родилось идей новых? Попробовал эту же версию Netbeans на Mac OS X 10.5.2 - аналогично.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от andreyu

если заменить

${OBJECTDIR}/_ext/home/andrey/projects/NetBeansProjects/test/src/main.o: /home/andrey/projects/NetBeansProjects/test/src/main.cpp
        ${MKDIR} -p ${OBJECTDIR}/_ext/home/andrey/projects/NetBeansProjects/test/src
        $(COMPILE.cc) -O2 -o ${OBJECTDIR}/_ext/home/andrey/projects/NetBeansProjects/test/src/main.o /home/andrey/projects/NetBeansProjects/test/src/main.cpp


на

${OBJECTDIR}/_ext/home/andrey/projects/NetBeansProjects/test/src/main.o: /home/andrey/projects/NetBeansProjects/test/src/main.cpp <path to newfile.h>/newfile.h
        ${MKDIR} -p ${OBJECTDIR}/_ext/home/andrey/projects/NetBeansProjects/test/src
        $(COMPILE.cc) -O2 -o ${OBJECTDIR}/_ext/home/andrey/projects/NetBeansProjects/test/src/main.o /home/andrey/projects/NetBeansProjects/test/src/main.cpp

то я уверен всё будет работать ;)

Cy6erBr4in ★★★
()
Ответ на: комментарий от Cy6erBr4in

> то я уверен всё будет работать ;)

Да, это поможет, но при добавлении в проект файлов придется каждый раз править руками. В большом и активно растущем проекте править Makefile каждый раз руками несколько не удобно.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от andreyu

В любом случае тут видна проблема в генерации Makefile`а, а не какие-то придуманные проблемы в GNU make... тут все вопросы к разрабам NenBeans :)

Cy6erBr4in ★★★
()
Ответ на: комментарий от Cy6erBr4in

> В любом случае тут видна проблема в генерации Makefile`а, а не какие-то придуманные проблемы в GNU make... тут все вопросы к разрабам NenBeans :)

Именно об этом я вначале и говорил, но вы сказали, что нечего валить вину на NetBeans ;)

Ну и ладно, остаюсь на Code::Blocks. Жаль, что он под Mac OS X ужасен.

anonymous
()
Ответ на: комментарий от anonymous

> Именно об этом я вначале и говорил, но вы сказали, что нечего валить вину на NetBeans ;)

Йа сказал?! Ничего подобного я не говорил :)

Cy6erBr4in ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.