// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= C/C++ Application Learning Trail
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: C/C++ Application Learning Trail - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, C/C++ Application Learning Trail

== Developing C, C++, and Fortran Applications

When you install the NetBeans IDE with C/C++ support, the IDE includes project types for C and C++ and appropriate templates. You can create C, C++, and Fortran applications with dynamic and static libraries, and you can also create C/C++/Fortran projects from existing sources. The editor indents, completes, and syntax-highlights C and C++ code and is well integrated with the GNU gdb debugger.

== Getting Started 

* link:../../community/releases/80/cpp-setup-instructions.html[+ Configuring NetBeans IDE for C/C++/Fortran+]

== Tutorials and Articles

=== Creating C and C++ Projects

* link:../docs/cnd/quickstart.html[+C/C++ Projects Quick Start Tutorial+]
* link:../docs/cnd/development-environment.html[+Defining Your C/C++ Project's Development Environment+]
* link:../docs/cnd/beginning-jni-linux.html[+Beginning JNI with NetBeans IDE and C/C++ Plugin on Linux+]

=== Developing C and C++ Projects

* link:../docs/cnd/navigating-editing.html[+Editing and Navigating C/C++ Source Files Tutorial+]
* link:../docs/cnd/debugging.html[+Debugging C/C++ Projects Tutorial+]
* link:../docs/cnd/remote-modes.html[+Modes of C/C++ Remote Development+]
* link:../docs/cnd/remotedev-tutorial.html[+C/C++ Remote Development Tutorial+]
* link:../docs/cnd/c-unit-test.html[+Adding Unit Tests to a C/C++ Project+]

== Tutorials and Articles

=== C and C++ Project How-tos

* link:../docs/cnd/HowTos.html[+C/C++ Application How-Tos+]
* link:../docs/cnd/depchecking.html[+Make Dependency Checking+]
* link:../docs/cnd/toolchain.html[+Using the C/C++ Tool Collection Descriptor+]
* link:../docs/cnd/cpp-vcs.html[+Storing NetBeans C/C++ Projects Under VCS+]
image::../../images_www/v6/trails/trails-box-br.png[] image::../../images_www/v6/trails/trails-box-bl.png[]image::../../images_www/v6/trails/trails-box-tr.png[] image::../../images_www/v6/trails/trails-box-tl.png[]

== Community-Contributed Docs

* link:http://wiki.netbeans.org/HowToCreate64-BitC/C++WindowsProgramWithNetBeans[+Setting up NetBeans IDE to Create 64-bit C/C++ Windows Executables+]
* link:http://wiki.netbeans.org/HowToSetup64-BitQt5WithNetBeans8.0OnWindows[+Setting up 64-bit Qt 5 on Windows to use with NetBeans IDE+]

== Other Resources

* link:../72/cnd/index.html[+C/C++ Documentation for Earlier Releases+]
* link:http://wiki.netbeans.org/NetBeansUserFAQ#NetBeans_C.2FC.2B.2B_Development_Pack[+NetBeans C/C++ Plugin FAQs+]
* link:https://netbeans.org/projects/cnd/lists[+NetBeans C/C++ Mailing Lists+]
